Mais où est passé le 32ème bit de mon LongWord ?

Résolu
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 - 27 avril 2005 à 00:05
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 - 27 avril 2005 à 01:17
Salut à toutes et à tous.



Le LongWord est-il réellement un 32 bits non signé ?

Son étendue devrait être 0..4294967295 (4 294 967 295).

Or l'étendue que je constate est 0..2147483647 (2 147 483 647).

Même limite supérieure que le LongInt, qui est un entier sur 32 bits
signé... sauf que mon LongWord, lui, il ne prend pas les valeurs
négatives !

J'ai l'impression de me faire avoir, quoi...



D'ailleurs, l'instruction

var LWrd: LongWord;

LWrd := 1 shl 31;

ne passe pas.



Je ne peux décaler en fait que de 30 bits.



Quelque chose doit m'échapper.



Si quelqu'un peut m'apporter un éclaircissement, je pourrai enfin dormir d'un sommeil moins agité les nuits prochaines.



Merci par avance, et bonne prog'



japee

4 réponses

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 avril 2005 à 00:18
Un petit transtypage, pour indiquer au compilateur que la constante entière que tu veux est de type LongWord, devrait résoudre ton problème :

LWrd := LongWord( 1 shl 31 );

Cordialement.
3
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 avril 2005 à 00:56
Tu as en effet une variable de type LongWord mais tu lui affectes une constante de type entier. Delphi détermine le type de données de la constante en fonction de sa valeur :
1 est compilé comme un integer (entier 32 bits signé)
1 shl 31 ne peut donc pas être compilé (valeur hors de la plage autorisée)
Cependant le fait de le transtyper permet à Delphi de savoir que la constante est entière mais non signée.
Pour le verifier, il suffit de transtyper uniquement 1 :
LWrd := LongWord( 1 ) shl 31 ;

Cordialement.
3
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
27 avril 2005 à 00:32
Salut, WhiteHippo !



Exact, ça fonctionne au poil.



Par contre, pourquoi faut-il transtyper une variable déclarée du même type ?

Je suis perplexe...



Merci pour ta réponse (super rapide !) que j'accepte.



Mais j'attends un peu pour valider, j'aurai peut-être ainsi quelques explications supplémentaires ?



Bonne prog'
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
27 avril 2005 à 01:17
Explication tout à fait lumineuse !



Merci d'avoir dissipé toutes mes interrogations à ce sujet.



Je vais mieux dormir cette nuit.



Cordialement à toi



japee
0
Rejoignez-nous