2の補数として解釈されてしまったバイト値を正しく読み替える

1つのアドレスが1バイトの値を格納し、リトルエンディアンで4バイトで1つの整数を表しているとする。つまりInt32的な。DWORD的な。

アドレス 値(10進数)
1 17
2 39
3 0
4 0

(0 * 232) + (0 * 216) + (39 * 28) + (17 * 20) = 10001

ここでアドレスの値が-128~127の10進数Xで表されているとする。正しくは0~255であり、負の値は2の補数として解釈された結果である。

元の値X 正しい値
0~127 0~127
-128~-1 128~255

元の値Xが負の値の場合、正しい値に変換するには256を加える。上記の表から直感的に理解できるが、2の補数では最上位ビットを128ではなく-128と解釈しているので、128 * 2を加えれば正しい値になる。

2進数 2の補数として解釈した10進数
0000 0000 0
0111 1111 127
1000 0000 -128
1000 0001 -127
1111 1111 -1

これを用いて以下の値を求める。

アドレス 値(10進数)
1 -79
2 -83
3 1
4 0

(0 * 232) + (1 * 216) + ((-83 + 256) * 28) + ((-79 + 256) * 20)
= (1 * 216) + (173 * 28) + (177 * 20)
= 110001