char类型的取值范围
所有的C语言的书籍里都会告诉你signed char的取值范围为-128 ~ 127,但是从来没有人告诉你为什么会是这样;
我们先来算算,有符号的char占一个字节,最高位表示正负,其余的七位表示数值,七位二进制可以表示128个数(2^7 = 128),即0~127;加上符号位后,就变成了-127 ~ -0,0 ~127,这时,就会出现‘-0’这样一朵奇葩;
我对网上关于-0和-128原码相同的这种说法表示很无语;
我们知道,计算机是以补码的形式存数据的;
-0和-128在计算机中是怎样存的?
所以,-128和-0的原码是不一样的;
但是,我们的char类型是8位,它把-128最高位符号位截掉了,这样-128的原码就变成了1000 0000;
被截短的-128的原码才和-0的原码相等;
既然都说到这里了,终于可以不提‘-0’这个恶心的东西了,今后看到一个有符号的char,它的原码用二进制表示为1000 0000的时候,我们就把它当做-128就可以了(只是看做,-128的原码可不是1000 0000);
下面,我们来看一下这个程序:
它会打印127,为什么?
-129 = -128 -1;因为计算机只会算加法,所以转换成-128 + (-1)
-
-128 原码: 1000 0000
反码: 0111 1111
补码: 1000 0000
-1 原码: 1000 0001
反码: 1111 1110
补码: 1111 1111
-128 + (-1)
1 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 1
---------------------------
1 0 1 1 1 1 1 1 1
因为a是一个char类型的,所以,会打印127,这只是研究阶段,但请不要这样使用!
参考自:http://www.embedu.org/Column/Column771.htm
还没有评论,来说两句吧...