为什么char二进制最小的数为-128,浅谈-0与-128

char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed。虽然char在标准中是unsigned(因为char类型提出的初衷是用来表示ascii码,ascii码的范围是0~127),但实际情况中究竟是signed还是unsigned取决于编译器。
vs2013中默认为signed.
-128 和-0的区别,其实根本就没有联系。但是容易迷惑。

因为我们说 -128的时候,其实是在说补码,他本身是补码。而我们说-0的时候,是说的原码。
char类型中-128是没有原码补码的,8位表达不出来。

unsigned char;
//char为1个字节,8个比特位
//无符号那么范围就是0000 0000————1111 1111 
//转换为2进制为,0——2^8-1
//              0——255
signed char;
//有符号,最高一位是符号位,除去符号位还有7位
//那么范围就是1111 1111————0111 1111
//                -2^7—————2^7-1
//                -127——————127
//                -128——————127

按照上述的步骤按理来说signed char的取值范围就是-127—127了,但是有符号数有个特殊的存在 0,他的二进制表示为0000 0000。有符号所以(-0表示)为1000 0000.但是-0没有意义,他实际表示出来也就是0,他两用一个相同的二进制表示就可以了。 那么1000 0000 怎么办,那么就给他顺延后去,所以实际取值范围-128—127
1表示负数,所以规定-128。还有一个原因:
128原码: 0000 0000 0000 0000 0000 0000 1000 0000
-128的原码: 1000 0000 0000 0000 0000 0000 1000 0000
取反 : 1111 1111 1111 1111 1111 1111 0111 1111

加1得到-128的补码: 1111 1111 1111 1111 1111 1111 1000 0000
存进去 : 1000 0000
补码正好是: 1000 0000
所以规定signed char 类型见到1000 0000表示为-128有两个原因:

1.不能造成浪费,它要表示个东西。1表示为负,往后顺延一位。
2.经过计算发现4字节得到-128的补码,经过截断至1字节后刚好表示为1000 0000

猜你喜欢

转载自blog.csdn.net/qq_45928272/article/details/109626998