char类型的取值范围

一时失言乱红尘 2022-06-11 00:07 295阅读 0赞

所有的C语言的书籍里都会告诉你signed char的取值范围为-128 ~ 127,但是从来没有人告诉你为什么会是这样;

我们先来算算,有符号的char占一个字节,最高位表示正负,其余的七位表示数值,七位二进制可以表示128个数(2^7 = 128),即0~127;加上符号位后,就变成了-127 ~ -0,0 ~127,这时,就会出现‘-0’这样一朵奇葩;

我对网上关于-0和-128原码相同的这种说法表示很无语;

我们知道,计算机是以补码的形式存数据的;

-0和-128在计算机中是怎样存的?

Column771-1.jpg

所以,-128和-0的原码是不一样的;

但是,我们的char类型是8位,它把-128最高位符号位截掉了,这样-128的原码就变成了1000 0000;

被截短的-128的原码才和-0的原码相等;

既然都说到这里了,终于可以不提‘-0’这个恶心的东西了,今后看到一个有符号的char,它的原码用二进制表示为1000 0000的时候,我们就把它当做-128就可以了(只是看做,-128的原码可不是1000 0000);

Column771-2.jpg

下面,我们来看一下这个程序:

Column771-3.jpg

它会打印127,为什么?

-129 = -128 -1;因为计算机只会算加法,所以转换成-128 + (-1)

  1. -
  2. -128  原码: 1000 0000
  3.     反码: 0111 1111
  4.     补码: 1000 0000
  5. -1   原码: 1000 0001
  6.     反码: 1111 1110
  7.     补码: 1111 1111
  8. -128 + (-1
  9.     1 0 0 0 0 0 0 0
  10.    + 1 1 1 1 1 1 1 1
  11.     ---------------------------
  12.     1 0 1 1 1 1 1 1 1

因为a是一个char类型的,所以,会打印127,这只是研究阶段,但请不要这样使用!

参考自:http://www.embedu.org/Column/Column771.htm

发表评论

表情:
评论列表 (有 0 条评论,295人围观)

还没有评论,来说两句吧...

相关阅读