Aide pour un noob

Aide pour un noob - C - Programmation

Marsh Posté le 22-11-2011 à 21:11:30    

Salut à tous !  
 
J'ai deux question a vous posé :  
La première étant : Est-il possible qu'une adresse soit négative ? Je pense bien que non mais bon ... a la vue de mon display
 
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    long test = 0;
    printf("Choisir une valeur pour la variable Test :" );
    scanf("%d", &test);
    printf("la valeur de test vaut : %d \n", test);
    printf("La variable test ce trouve a %ld dans la mémoire RAM", &test);
    return 0;
}
 
Au derniers printf quand je veux lire l'adresse de ma variable dans ma mémoire, je me retrouve avec une valeur avec un "-" devant, ce qui m'a laissé un peu perplexe !
Exactement ceci : "-1081149812"
 
Qu'en pensé vous ?  
 
 
 
J'ai ensuite une deuxième question : %d, %ld, %f, %lf
 
Est ce quelqu'un pourrait me dire vite fait ce qu'il faut savoir la dessus ?
 
Je sais que %d renvoie une valeur non décimale, et %f oui, mais que c'est deux sont seulement utilisable dans un printf mais j'ai remarque que si je mettais %ld ca marcher quand meme ... Ce qui me laisse égualement perplexe  
 
 
Merci.

Reply

Marsh Posté le 22-11-2011 à 21:11:30   

Reply

Marsh Posté le 22-11-2011 à 21:39:09    

man printf ( http://www.linux-kheops.com/doc/ma [...] ntf.3.html )
 

Citation :


...
d, i
    L'argument int est convertie en un chiffre décimal signé. La précision, si elle est mentionné, correspond au nombre minimal de chiffres qui doivent apparaître. Si la conversion fournit moins de chiffres, le résultat est rempli à gauche avec des zéros. Par défaut la précision vaut 1. Lorsque 0 est converti avec une précision valant 0, la sortie est vide.  
 
...


 
Tu demandes à afficher un entier signé, c'est ce que printf fait.
 
Généralement, une adresse est exprimée en hexadécimal, il faut donc utiliser %X , tu peux mettre %08X pour l'afficher de taille fixe et correctement sur un système 32 bits.
 
edit : le "." était une faute de frappe.


Message édité par xilebo le 23-11-2011 à 08:01:34
Reply

Marsh Posté le 22-11-2011 à 22:18:17    

Je ne comprends pas très bien, les valeurs Hexa sont pas avec un "$" ?  
 
Les arguments qui suive "%" comment fonctionne-t-il ?  
J'ai lu le manuel mais c'est un peu cru :s

Reply

Marsh Posté le 22-11-2011 à 22:45:45    

Citation :

Je ne comprends pas très bien, les valeurs Hexa sont pas avec un "$" ?  

Comment voudrais tu que cela soit, avec un $, qu'on comprenne ta question??
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 23-11-2011 à 13:27:49    

Je précise "noob" et tu me donnes des infos mal expliqué, je redemande des infos et tu me dis A+ ...  En plus tu réponds a une question sur deux ...
 
La ya du modérateur ! Si tu comptes pas m'aider réponds meme pas a mon post j'm'en porterai bcp mieux.  
 
Peace

Reply

Marsh Posté le 23-11-2011 à 13:58:21    

Je te demande de préciser ta question, parce que c'est pas clair (ben oui, si le rapport entre de l'hexa et un $ est clair à tes yeux, ce ne l'est pas aux yeux des autres), et pour répondre à une question, encore faut il qu'elle soit claire, et voila comment tu réagis?
Tu as même pas l'air d'avoir remarqué que xilebo et moi, c'est pas pareil (> "tu me donnes des infos mal expliquées" alors que j'ai donné aucune info, puisque j'attendais la clarification pour pouvoir en donner).
Ben c'est mon premier et dernier avertissement, si tu changes pas de comportement, tu vas pas faire de vieux os dans cette section.
A bon entendeur, et
A+,


Message édité par gilou le 23-11-2011 à 14:04:56

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 23-11-2011 à 14:21:28    

Bonjour,
 
Il faut imaginé la mémoire comme un grand damier. Chaque case ont pour adresse une valeur hexadécimal.
 
Or l'argument de formatage "%d" signifie que l'argument que tu passera a printf sera interprété comme étant un ENTIER!
 
Donc si tu passe d'un hexadécimal a un entier, il est fort probable que le résultat soit farfelue.
 
Les entiers se base sur le système décimal et non hexadécimal.
 
Pour cela, tu dois utiliser le formatage "%x" et "%X".
 
x : 0123456789abcdef
 
X : 0123456789ABCDEF
 
Ensuite, %d signifie "int" et "%ld" signifie "long int".
 
Un "int" sur les processeur 16 bits est égal a 2 octets de mémoire, et 4 octets sur les 32 bits.
Un "long int", que le processeur soit 16 ou 32 bit, est égal a 4 octet.
 
Il était important de savoir quelle variable utiliser, avant, en fonction du nombre sur les 16 bits.
 
Mais, maintenant la plupart des processeurs sont 32bit ou 64bits. Donc un "int" et un "long int" ont exactement la même taille en mémoire.
 
Ce qui explique pourquoi printf ne fait pas de distinction entre "%ld" et "%d".

Reply

Marsh Posté le 23-11-2011 à 14:56:32    

Merci Mohoi

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed