char类型取值范围分析

众所周知,char类型分为unsigned char(无符号类型)和signed char(有符号类型)。

我先将这些范围用代码打印出来:

printf("%d\n",SCHAR_MIN);   //signed char最小值 
printf("%d\n",SCHAR_MAX);   //signed char最大值 
printf("%d\n",UCHAR_MAX);   //unsigned char最大值

 

一:先来谈谈unsigned char。
char类型为一个字节大小,一个字节又分为8位,我们假象char类型占用内存情况如下所示:

               

因为为无符号类型,所以没有负数,即第一个符号位不存在(即最左边的一位存放的数不代表正负),可用来正常存放源码,所以unsigned char 的最大值为2的8次方减一,即255;当然,最小值为0;
所以unsigned char 的取值范围为0~255;

二:signed char
上面看到,signed char的取值范围为-128~127;
对于127,大家应该能想到,即最左边的符号为占用一格(符号位为一为负,为0为正),所以出去符号位,还剩7个储存位,所以最大值理所当然为2的7次方减一,即127;   同理可得,负数时只是符号为变为一,负数最小数就应该为-127,但为啥偏偏是-128呢,这里就要用到补码的知识,补码规定: 正数的补码是其本身,负数的补码为其反码加一 ,所以,负数转化为补码需两个步骤, 第一,先转化为反码,第二: 把反码加一。我们计算可得-128的补码为1 1000 0000,恰巧,这是-128的源码,发现和原码一样,所以,-128的原码和-0(1000 000)的原码是不同的,但是在char 型中,是可以用1000 000 表示-128的,关键在于char 是8位,它把-128的最高位符号位1 丢弃了,截断后-128的原码为1000 000 和-0的原码相同,也就是说:

1000 0000  和-128丢弃最高位后余下的8位相同,所以才可以用-0 表示-128,这样,当初剩余的-0(1000 0000),被拿来表示截断后的-128,因为即使截断后的-128和char 型范围的其他数(-127~127)运算也不会影响结果, 所以才敢这么表示-128。

猜你喜欢

转载自blog.csdn.net/eternal_yangyun/article/details/82682540
今日推荐