Page 1 sur 1

Conversion nombre signé vers nombre non signé

Publié : sam. 30/oct./2004 23:41
par Le Soldat Inconnu
Voici l'astuce avec les valeur 8bits

Code : Tout sélectionner

Byte.b = ...
ByteNonSigne.l = $FF & Byte
et avec les valeurs 16bits

Code : Tout sélectionner

Word.w = ...
ByteNonSigne.l = $FFFF & Word
Et on peut extrapoler pour les valeurs 24bits, 32bits (attention dans ce cas car il faut utiliser une variable 64bits, car si on utilise une valeur 32, on ne change rien), etc...
Pour extrapoler, il suffit de faire un "$FF & ValeurSigne" avec $FF qui augmente en fonction du nombre de byte de la variable



Pourquoi mon astuce retire le signe ?

Prenons un exemple avec une variable 8bits signé
00000000 vaut 0
00000001 vaut 1
01111111 vaut 127
10000000 vaut -128 (et 128 en non signé)
11111111 vaut -1 (et 255 en non signé)

donc si le bit de rang le plus élevé (donc le premier) est à 1, on a une valeur signé.
Quand on a une valeur signé, pour connaître sa valeur, on inverse tout les bit et on ajoute 1

Exemple:
10000000
on inverse
01111111 = 127
127 + 1 = 128
donc -128

Quand je fais
Long.l = %10000000 = -128
j'otients Long = 11111111 11111111 11111111 10000000 = -128
et si je fais
Long & $FF
soit
11111111 11111111 11111111 10000000 & 00000000 00000000 00000000 11111111
il reste 00000000 00000000 00000000 10000000 soit 128 qui correspond à la valeur non signé

Publié : dim. 31/oct./2004 11:17
par nico
C'est Cool et beaucoup mieux que la méthode de l'addition que j'utilisais.

:)

Publié : lun. 01/nov./2004 1:10
par KarLKoX
Tres bonne astuce, pratique et la plus rapide.
Juste une petite incohérence : il est plus logique d'appliquer le masque binaire apres et non avant ( valeur & $FF), pour une meilleur compréhension du lecteur :)

Publié : lun. 01/nov./2004 2:43
par ZapMan
C'est bien expliqué. SUper !