您的位置:首页 > 其它

char类型的取值范围

2017-07-25 22:05 363 查看
所有的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐