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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值