计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用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的形式进行存储的。
1)正数的原码、反码、补码相同。1byte容纳正整数的补码取值范围为:
0000 0000 (+0)
...
0111 1111 (+127)
2)1byte容纳负整数的补码取值范围为:
1000 0000 (-128) 这个比较特殊
...
1111 1111 (-1)
关于-128:
-1补码是1111 1111再减127,即 1000 0000 表示-128的补码
unsigned
参考:
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?
https://zhidao.baidu.com/question/140643749696415725.html?qbl=relate_question_2 C语言-128的表示