带符号的char类型取值范围为什么是-128——127

来源:互联网 发布:zblog模板php免费 编辑:程序博客网 时间:2024/05/14 02:18

以前经常看到带符号的char类型取值范围是-128——127,今天突然想为什么不是-127——127,-128是怎么来的?

 

127好理解,char类型是8位,最高位是符号位,0正1负,所以01111111是127。

 

但是-128是怎么来的呢?11111111不是-127吗?

 

后来想起来计算机里面所有数都是用补码表示的,正数补码是其本身,负数补码是原码的反码加1。

 

所以-127是10000001,而10000000换算过来就是-128。

所以, 8位有符号的整数取值范围的补码表示 
1000 0000 到 0000 0000, 再到 0111 1111 
即 -128 到 0, 再到 127 
最终 -128 ~ +127

补充说明

   “一个n位有符号int型数值,其范围为-2^(n-1) ——2^(n-1) -1”,对于这个问题,很多人都是困惑不已。其实,导致此情况的根本原因是“人们解决问题时,习惯以人的思维思考问题,但是,计算机本身确实以机器的思维进行处理的”。在这里,就表现为“计算机对数据的处理其实是以‘补码’的形式,而非日常生活中人们进行数学运算所采用的‘原码’的形式”,但是,人们在对“此数值范围”进行处理的时候,却习惯性的采用了“原码作为机器码”。

    在历史上,针对“数值”计算,计算机先后采用过3种机器码——原码、反码和补码。

    具体表示如下:

1.  原码   最高位为符号位,其余为对应数值的绝对值的二进制数值表示

2.  反码   最高位为符号位,正数=原码 负数=符号位+原码对应的其他位数取反;

3.  补码   最高位为符号位,正数=原码  负数=反码+1。

    其中,符号位“0为+,1为-”。

    因为,计算机为数据类型分配了n位,超过n位的数值会被自动舍弃,那么, 就可以发现,现在计算机系统中采用的补码,克服了“原码中存在+0和-0”的情况,仅表现为一个0,(对于8位数据类型,即为8个0,具体推导见转载内容的穷举,-128计算补码时,产生的9位数据11000 0000--补码1000 0000)。

    对应而言,8位有符号位数值的范围就成为了“-2^(8-1) ——2^(8-1) -1”,即“-128——+127”。

    问题的关键就在这里了,“计算机为有符号int型数值分配固定的位数n存储数据,当数据位数大于n时,大于n的位数被自动舍弃”。这就是导致数值范围为“-2^(n-1) ——2^(n-1) -1”的原因,从而,也导致了数据范围中“模”概念的产生。

注:

1. 模

  “模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。例如,虽然时钟的模=12,但是在时钟的指针并不能真正指向“12点”,“12点”的位置和“0点”是重合的,即12点以0点表示。

    换句话说,时钟的范围“0——11”,则模为12。

    对应而言,n位无符号数值的计量范围0~2^(n)-1,模=2^(n); n位有符号数值,数值范围-2^(n-1) ——2^(n-1) -1,则模为2^(n-1)。举例说明,8位无符号数值,二进制模为2^8;8位有符号数值,表示的数值范围为0——2^8-1。

2. 补码的运算规则

[X+Y]补 = [X]补 + [Y]补 ;[X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补。

 转自:http://blog.csdn.net/huang_jinjin/article/details/7420545

0 0