標籤:blog http io ar os sp 資料 div log
原文:原碼反碼補碼
原碼: -16 = 10010000 1表示符號位(1負0正)
反碼: -16 = 11101111
補碼: -16 = 11110000
原碼: 9 = 00001001 1表示符號位(1負0正)
反碼: 9 = 00001001
補碼: 9 = 00001001
-16 + 9
11110000
+ 00001001
11111001(補碼)
11111001的反碼 10000110
11111001的原碼 10000111 = -7
-7 原碼 100000111
-7 反碼 111111000
-7 補碼 111111001
補碼減1得到反碼,反碼取反得到原碼
-----------------------------------------------------------------
#include<stdlib.h>
#include<stdio.h>
int main(int argc, char* argv[])
{
short a, b, c;
a = 32767;
b = a + 1;
c = b + 1;
printf("%d\n", sizeof(a));
printf("a = %d, b = %d, c = %d", a, b, c);
getchar();
return EXIT_SUCCESS;
}
運行結果:
因為a = 32767,正數的原碼反碼補碼都是一樣,記憶體中資料用補碼錶示,所以a在記憶體中表示為0111 1111 1111 1111
1在記憶體中的表示為0000 0000 0000 0001
於是a + 1 對補碼進行與運算得到
0111 1111 1111 1111
0000 0000 0000 0001
---------------------------------------
1000 0000 0000 0000
而1000 0000 0000 0000最高位是1表示負數,又因為其是補碼,補碼減1取反得到:
1000 0000 0000 0000
0000 0000 0000 0001
------------------
1111 1111 1111 1111
對1111 1111 1111 1111 取反得到
1000 0000 0000 0000 值為-32768
因為-32768 在記憶體中的補碼為: 1000 0000 0000 0000
當-32768 + 1 表示為:
1000 0000 0000 0000
0000 0000 0000 0001
-------------------------------------------------
1000 0000 0000 0001
1000 0000 0000 0001為補碼,對其減1取反:
1000 0000 0000 0001
0000 0000 0000 0001
-----------------------------------
1000 0000 0000 0000
對1000 0000 0000 0000取反得到:
1111 1111 1111 1111表示數值-32767
原碼反碼補碼