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