这是一个困惑了我几年的问题,它让我对现在的教科书和老师极其不满,从我N年前开始摸电脑时,就几乎在每一本C++教科书上都说,8位有符号的取值范围是-128~+127,为什么不是-127~+127呢,后来的java,int的聚值范围,再32位计算,-2^31 ~ +2^31-1,可是,却从来没有任何一本教科书或一个老师比我解释过这个问题。 原因没有在工作上或者是什么地方直接遇到它,所以我也一直忽略它,但心里总是有一根刺.直到刚才!!!! 
    就是刚才,无聊之极,在看汇编的书时,又遇到它了,但一如以往,书上直接地,有心地,明显地绕过了这个问题,真是可恶啊.

几经周折,终于把它搞清楚了: 
其实,它是计算机底层为了实现数值运算而决定的,涉及非常非常基础的原码,反码,补码知识,一般(99.9999%)都不会用得上. 那0.0001%,估计也就是计算机考试了.

话说: 
    用2^8来表示无符号整数的话,全世界的理解都是0 - 255了,那么,有符号呢? 用最高位表示符号,0为+,1为-,那么,正常的理解就是 -127 至 +127 了. 
    这就是原码了,值得一提的是,原码的弱点,有2个0,即+0和-0,还有就是,进行异号相加或同号相减时,比较笨蛋,先要判断2个数的绝对值大小,然后进行加减操作,最后运算结果的符号还要与大的符号相同. 
于是乎,反码产生了,原因....略,反正,没过多久,反码就成为了过滤产物,也就是,后来补码出现了.

补码的知识不说述,只说有关+127和-128的. 
     官方的定义 [-2^(n-1),2(n-1)-1],补码的0没有正负之分.原因呢?没有一本书上有说,这也是我这么火的原因,但通过思考,google,再思考,很快找到答案: 
     首先,难不免干点白痴般地事情,穷举一下... 
正数,原码跟补码一样 
+127, 0111 1111 
+126, 0111 1110 
+125, 0111 1101 
+124, 0111 1100 
+123, 0111 1011 
+122, 0111 1010 
... 
  +4, 0000 0100 
  +3, 0000 0011 
  +2, 0000 0010 
  +1, 0000 0001 
   0, 0000 0000 (无正负之分)

下面是负数了,值,原码,符号位不变其它取反,+1

-1, 1000 0001, 1111 1110, 1111 1111 
  -2, 1000 0010, 1111 1101, 1111 1110 
  -3, 1000 0011, 1111 1100, 1111 1101 
  -4, 1000 0100, 1111 1011, 1111 1100 
  -5, 1000 0101, 1111 1010, 1111 1011 
  -6, 1000 0110, 1111 1001, 1111 1010 
  -7, 1000 0111, 1111 1000, 1111 1001 
  -8, 1000 1000, 1111 0111, 1111 1000 
  -9, 1000 1001, 1111 0110, 1111 0111 
-10, 1000 1010, 1111 0101, 1111 0110 
-11, 1000 1011, 1111 0100, 1111 0101 
-12, 1000 1100, 1111 0011, 1111 0100 
-13, 1000 1101, 1111 0010, 1111 0011 
-14, 1000 1110, 1111 0001, 1111 0010 
-15, 1000 1111, 1111 0000, 1111 0001 
-16, 1001 0000, 1110 1111, 1111 0000 
-17, 1001 0001, 1110 1110, 1110 1111 
... 
-24, 1001 1000, 1110 0111, 1110 1000 
... 
-99, 1110 0011, 1001 1100, 1110 0100 
... 
-124, 1111 1100, 1000 0011, 1111 1101 
-125, 1111 1101, 1000 0010, 1000 0011 
-126, 1111 1110, 1000 0001, 1000 0010 
-127, 1111 1111, 1000 0000, 1000 0001 
看出点什么了没有? 
如果没有,那么,给个提示, 再继续下去,下一个补码是什么呢?

当然是 
-128, 先略过,再略过, 1000 0000

1000 0000,那么,它的原码是什么呢? 
从补码求原码的方法跟原码求补码是一样的 
先保留符号位其它求反:  1111 1111, 再加1:11000 0000, 超过了8位了 
对,用8位数的原码在这里已经无法表示了 
关键就在这里,补码 1000 0000 为 -128 是不用怀疑的(上面的穷举), 
那么,回到原码处, 它的原码也是 1000 0000(超出的自动丢失), 
1000 0000 在原码表示什么呢? -0, 但补码却规定0没有正负之分 
转换一下思路,看看计算机里,是怎么运算的: 
对于负数,先取绝对值,然后求反,加一 
-128 -> 128 -> 1000 0000 -> 0111 1111 -> 1000 0000 
现在明确了吧.

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

感谢google,感谢被我浏览过又关闭了还忘记了姓名的广大的blog们,CSDN(那上面也有些不错的东西)

-------------------------------------------------------------------

补充说明

   “一个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://baike.baidu.com/view/377340.html?wtp=tt

   http://baike.baidu.com/view/742694.htm?fr=ala0_1

   http://baike.baidu.com/view/60480.htm

   http://www.cppblog.com/goal00001111/archive/2010/04/16/112745.html

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

为什么8位有符号数的范围为“-128 — +127”?(转载加补充)相关推荐

  1. 8位有符号数的范围为-128 ~ +127 深入浅出探究

    8位有符号数的范围为-128 ~ +127,为什么不是 -127 ~ 127,-127 ~ 128等等? 这是一个困惑了我几年的问题,它让我对现在的教科书和老师极其不满! 从我二三十年前开始摸电脑时, ...

  2. 为何八位有符号整数的范围是-128~127,而不是-127~128

    八位的带符号的整数,比如JAVA中的byte,c#中的SByte,为什么值域范围都是-128-127而不是-127~128? 事实上,远古时期有些计算机的设计是采用了反码表示有符号数的,因此8位有符号 ...

  3. 汇编8位有符号数相加

    操作环境:emu8086 问题描述: 设从BUF开始存放有若干带符号字节数(8位),将它们相加并将结果(超过一个字节范围)存放到字单元SUM中 需要知道的知识: 1.8位有符号数在寄存器中是以补码形式 ...

  4. 为什么8位二进制的取值范围是-128~127

    我的疑惑 一个字节8位,其中最高位表示正数和负数,0表示正数,1表示负数.所以能够表示-128-+127. 01111111可以表示+127.正数这一段没有问题,负数这一段有两个疑问 11111111 ...

  5. 为什么8位有符号数的取值范围是-128~+127

    首先我们知道,计算机以补码的形式存储的,正数的补码是原码不变,负数的补码是原码的取反加1. 我们先来看+127,原码0111 1111对吧,若+128是多少呢,0111 1111 + 1 = 1000 ...

  6. 8位有符号类型的数值范围是-128~127,why -128?

    8bit无符号数范围为:0 ~ 255,这是没有什么疑问的. 8bit有符号数范围为:-128 ~ 127 ,然而直观来看,0000 0001即为1,1000 0001即为-1,那么很容易得到8位有符 ...

  7. 理解有符号数和无符号数的区别

    理解有符号数和无符号数 回头看上一节,我们所讲的数都是正数.同样是年纪和工资,前者不需要有负值,但后者可能需要--至少所有的老板都这样认为. 那么,负数在计算机中如何表示呢? 这一点,你可能听过两种不 ...

  8. 工作日常记录:整数有符号数除以无符号数的那些事

    问题 :32位有符号数作为被除数,16位无符号数作为除数,计算结果正常,但是当32无符号数作为除数就出出现异常情况 void test( void ) {int a = -33;unsigned sh ...

  9. 理解有符号数和无符号数的区别。

    理解有符号数和无符号数 回头看上一节,我们所讲的数都是正数.同样是年纪和工资,前者不需要有负值,但后者可能需要--至少所有的老板都这样认为. 那么,负数在计算机中如何表示呢? 这一点,你可能听过两种不 ...

最新文章

  1. 50道练习实践学习Pandas!
  2. 人工智能热潮下,我们该如何紧跟科技脚步呢?
  3. 什么是menuconfig和menuconfig的使用方法和技巧
  4. 一个不错的SQL储存过程分页,储存过程+Repeater,如果只是浏览数据的话,快就一个字...
  5. 关于Web前端面试的小技巧,千万不要错过!
  6. Spring Cloud Gateway 源码解析(3) —— Predicate
  7. web.xml加载顺序
  8. 通过小程序给公众号传递消息_多输入现场消息传递应用程序概念
  9. 【ASP.NET Web API教程】2.3 与实体框架一起使用Web API
  10. C++学习_第1章_从C到C++
  11. 十年数据分析经验,总结出这三类分析工具最好用
  12. keep怎么生成运动轨迹_空间新物种 !| 垂直运动路径与商业综合体的整合与植入...
  13. python3 写九九乘法表(python 小白进阶之旅)
  14. 读c语言深度剖析 -- 宏定义(2)
  15. netty4 io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
  16. 苏州VS上海:城市化的二个阶段
  17. Web服务器技术的优缺点有哪些?
  18. 火焰图:全局视野的Linux性能剖析
  19. 通证网:一建的报考条件
  20. 实现直播视频app源码的底部导航栏

热门文章

  1. Java并发包下的CAS相关的原子操作
  2. OAuth2.0认证服务器之客户端相关配置
  3. Apache Bench
  4. 手动选择显示_为什么考驾照的人多数选择C1而不是C2?老教练说出了真相....
  5. switch语句判断范围_MQL5从入门到精通【第四章】(一)条件判断语句
  6. linux 重定向_Linux视频教程分享,零基础在家你也可以学的会
  7. androidstudio 评论栏_android-studio 添加没有菜单栏和actionBar的模板
  8. 电子商务网站中订单号设计规则和依据
  9. springboot 文件上传 设置文件大小配置
  10. JMeter中持续时间设置成永远调度器才会起作用