Conversion nombre signé vers nombre non signé
Publié : sam. 30/oct./2004 23:41
Voici l'astuce avec les valeur 8bits
et avec les valeurs 16bits
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é
Code : Tout sélectionner
Byte.b = ...
ByteNonSigne.l = $FF & Byte
Code : Tout sélectionner
Word.w = ...
ByteNonSigne.l = $FFFF & Word
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é