为什么char的取值范围为是-128-127?
char是由8位的二进制组成,8位二进制能表示的最大值是
1111 1111
,用十进制表示就是255,那怎么去表示负数呢?
规定用第一位去表示符号位,1表示负数、0表示正数。例如
1111 1111
就表示 -127,0111 1111
表示+127。
- 那么我们去想个问题
1000 0000
和0000 000
分别代表什么?
大家一看可能就会觉得太简单了吧,不就是-0和+0嘛。但是在计算机的世界里-0和+0都是0,所以为为了扩大char的表示范围我们就规定1000 0000
表示 -128。
- 那么我们再去想一个问题为什么是
1000 0000
代表-128而不是0000 0000
代表-128?
首先由上面讲述的规则可以知道
0
是代表正数,使用0000 0000
表示正数会更合适
还有就是我们可以从我们人的习惯来看,让一个char从
0000 0000
一直加到1111 1111
,可以发现是先0000 0000
再到1000 0000
,使用用0000 0000
表示0,1000 0000
表示-128符号我们正常的加法习惯。
int main()
{
char i = 0; // 0000 0000
for (int j = 0; j < 256; j++)
{
printf("%d、", i++);
}
return 0;
}
由一个简单的程序也可以去验证我们的猜想
这里可能大家还有个疑问,
1000 0001
不应该是-1嘛,怎么变成了-127?
其实在计算机存储数据的时候都是用补码的形式,正数的补码是他本身,负数的补码保持符号位不变,其他位取反然后+1。所以1000 0001
变成补码的形式是1111 1111
,为-127
欢迎关注微信搜索乐天小白我的个人公众号,里面不定期更新各种干货,有最新的科技咨询和前沿的科技知识分享,还有Linux、嵌入式和单片机相关的干货知识。