計算機中的有符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同。在計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理
- 正整數的補碼是其二進制表示,與原碼相同;
- 求負整數的補碼,將其對應正數二進制表示所有位取反(包括符號位,0變1,1變0)后加1;
示例:負數-1, (此處,假設是8位二進制表示)
對應正數的原碼:0000 0001
取反: 1111 1110
加1 : 1111 1111
最終,-1是以1111 1111的形式進行存儲的。
負數-127, (此處,假設是8位二進制表示)
對應正數的原碼:0111 1111
取反: 1000 0000
加1 : 1000 0001
最終,-127是以1000 0001的形式進行存儲的。
關於-128:
-1補碼是1111 1111再減127,即 1000 0000 表示-128的補碼(8位二進制表示的最小負數)
unsigned char 范圍 0 - 255
signed char 范圍 -128 到 127
無符號的 0000 0000 (0)有符號數里表示 +0
無符號的 0111 1111 (127)有符號數里表示 +127
無符號的 1000 0000 (128)有符號數里表示 -128 (8位二進制表示的最小負數)
無符號的 1000 0001 (129)有符號數里表示 -127
無符號的 1111 1111 (255)有符號數里表示 -1
參考:
https://www.runoob.com/cprogramming/c-data-types.html C語言教程-數據類型
https://blog.csdn.net/u010603798/article/details/78962666 C語言中負數的存儲
https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613 補碼
https://www.zhihu.com/question/28685048 補碼10000000為什么可以表示-128?