`

有符号的范围,-128~+127详解

阅读更多
这是一个困惑了我几年的问题,它让我对现在的教科书和老师极其不满,从我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(那上面也有些不错的东西)
over~
分享到:
评论
9 楼 billgui 2008-10-29  
简单地说,8位二进制数(一个byte),总共能表示256个值,-128到+127正好是256个值,也就是二进制表示从10000000到01111111。
8 楼 superloafer 2008-10-29  
这种问题,诸如整型,浮点型等等之类的数字在计算机内的表现形式,《计算机组成原理》花了整整一两章的篇幅来讲。
7 楼 txxg 2008-07-21  
http://blog.csdn.net/java_seven_net/archive/2006/04/03/649007.aspx
6 楼 dogstar 2008-06-16  
非科班的,看看深入计算机系统 这本书吧.
5 楼 bloodwolf_china 2008-06-11  
naiman 写道
……你在大学里面的课程设计没有做过汇编的东西,或者需要涉及到位运算的东西(如文件校验和)么?也没有思考过为什么有反码还要用补码的原因?...

有提到过补码有-128吗?嘿嘿。我也不是专科出身,但学过这些东东。一直也奇怪咋又-128呢,一个字节去掉符号位,范围是2**7-1=(-+)127,咋变也没有-128啊。

reno_k 写道
转换一下思路,看看计算机里,是怎么运算的:
对于负数,先取绝对值,然后求反,加一
-128 -> 128 -> 1000 0000 -> 0111 1111 -> 1000 0000
现在明确了吧

那-128此时在计算机里如何表示的呢?先有鸡还是先有蛋?

1000 0001   1111 1111   -1
1000 0010   1111 1110   -2
1000 0011   1111 1101   -3
......补码不断-1........
1111 1111   1000 0001   -127
无法表达      1000 0000   -128

规定 1000 0000 定为 -128的补码
这种定法和上面数学顺序的表述是一致的。
这样规定后,-128 + 1 = -127,负数的补码在机器中就好算了
否则补码1000 0000按照补码规则也可以表示为负0,但运算结果就不对了-0 + 1 =? -127
4 楼 naiman 2008-05-24  
wyyl00 写道
有符号就把范围分为正数和负数,0算正数,所以正数就知道127,这样理解呢,对吗

不对.一个字节=8个位,把第一个位当作正负号,剩下7个位来表示数字大小,能表示的数字最大绝对值就是2的7次方=127

这种表示方法会有两个0,1000 0000和0000 0000,一个负的0一个正的0,会给运算带来不少麻烦,所以才要用补码这种看上去这么别扭的方案.
3 楼 reno_k 2008-05-19  
也可以这么理解,+0当0用,-0当-128用,
to 1楼,没你那么幸福,大学时偶是读种树养鱼的,电脑是在高中学的,然后就是全部自学,你说的那几本书,只看过那本C++,里面就随便说了一下-128~+127,根本没说为什么是-128,但我相信这在汇编的书籍里很容易找到,不过我第一次看的汇编书也就是在写这贴子前1,2小时
2 楼 wyyl00 2008-05-18  
有符号就把范围分为正数和负数,0算正数,所以正数就知道127,这样理解呢,对吗
1 楼 naiman 2008-05-13  
……你在大学里面的课程设计没有做过汇编的东西,或者需要涉及到位运算的东西(如文件校验和)么?也没有思考过为什么有反码还要用补码的原因?

刚刚翻了翻自己大学4年的课本,其中有介绍过补码的书有《C语言程序设计(谭浩强 第二版)》,《计算机科学导论》,《汇编语言程序设计教程》,《计算机组成与系统结构》。其中《导论》和《组成》都有0000-1111的补码十进制取值穷举,是楼主自己看书不仔细吧?或者是楼主的书都没有做过这个穷举?

我大3的两个课程设计都用到了补码,一个是用复杂模型机实现乘法运算,提供的指令非常少,只能把被乘数取反加1(相当于把正整数变成相应的负数补码),然后不断+1,判断是否产生进位来实现for循环.
另外一个是实现简单的文件校验和,就是把文件的相邻32位两两相加,生成个32位的校验码,我是用java做的,做出来之后发现,只要文件中含有中文就会算错.做了单步调试才发现是补码运算惹的祸,凡是大于127的字节都被转成负的,然后发现java里面根本就没有无符号类型(也就是不存在值大于127的byte类型),只能自己手工把负的byte转成正的int才能保证运算的正确.

感觉凡是涉及字节流的处理,就不可能不留意补码这些底层的东西吧.

相关推荐

    MySQL 数据类型 详解

    1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3个字节 范围(-8388608~8388607) int(m) 4个字节 范围(-2147483648~2147483647) bigint(m) 8个字节 范围(+-9.22*10的18次方) ...

    原码,反码,补码详解及原理.docx

    原码 (1) 原码:在数值前直接加一符号位的表示法。 例如: 符号位 数值位 byte的取值范围 [+7]原= 0 0000111 B [-7]原= 1 0000111 B 注意: byte的取值范围是-2^7~ 2^7-1 总计256个数 ...有符号位 -128 ~ +127

    二进制图文详解

    +------------------------------------------- n = 00010100 11010111 01010001 11101010 ### >> 数学右移位 面试题目: 如何优化 n*8 ? 答案: n 提示: 被乘数一定是 2 的n次幂 如何优化 n%8 ? ...

    详解电路图中的电阻器电路图形符号

    电子元器件在电路中都有自己专属的图形符号,国标型号是有统一标准的,还有一些元器件也有自己独特的图形符号,国外的电子元器件符号也会与国内有所不同。1、普通电阻器电路图形符号: *电路图形符号表示电阻器有...

    Java中的正则表达式 -- 示例详解

    \S 非空白符号 [^\t\n\x0B\f\r] \w 单独字符 [a-zA-Z_0-9] \W 非单独字符 [^a-zA-Z_0-9] \f 换页符 \e Escape \b 一个单词的边界 \B 一个非单词的边界 \G 前一个匹配的结束 ^为限制开头 ^java 条件限制为以Java为...

    江苏省计算机三级偏软知识点及教程

    江苏省计算机三级偏软知识点 ...数据总线的特点是双向、三态,地址总线的特点是单向、三态,而控制总线有单向、双向,三态,二态等不同情况,是其中较为复杂、灵活,功能又最强的一类总线 压缩BCD码 规格化数 -9.625

    EL表达式 (详解)

    EL表达式 (详解) EL表达式 1、EL简介 1)语法结构 ${expression} 2)[]与.运算符 EL 提供.和[]两种运算符来存取数据。 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 ...

    单片机期末考试题目及答案详解

    A.80个单元 B.32个单元 C.128个单元 D.8个单元 5.在相对寻址方式中,寻址的结果体现在 A.PC中 B.累加器A中 C.DPTR中 D.某个存储单元中 6.在寄存器间接寻址方式中,指定寄存器中存放的是 A.操作数 ...

    VBSCRIP5 -ASP用法详解

    如果只需要查看某个主题(例如对象),则有对该主题进行详细说明的章节可供查阅。 如何操作呢?单击左边任意一个标题,即可显示该标题所包含的项目列表。从该列表中选择要查看的主题。打开所选主题之后,就能够很...

    C语言数据类型详解.doc

    C语言数据类型详解 介绍C语言中的数据类型, 符号属性, 长度属性, 基本型, 所占位数 ,取值范围, 输入符举例 ,输出符举例等内容 介绍的很详细.

    入门学习Linux常用必会60个命令实例详解doc/txt

    入门学习Linux常用必会60个命令实例详解 Linux必学的60个命令 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不...

    HTTP协议详解

    2 符号习惯和一般语法 2.1 扩充的BNF(扩充的 巴科斯-诺尔范式) 2.2基本规则 (basic rule) 3 协议参数 3.1 HTTP版本 3.2 统一资源标识符(URI) 3.2.1一般语法 3.2.2 http URL 3.2.3 URI 比较 3.3 日期/时间格式...

    算法心得:高效算法的奥秘(原书第2版).[美]Henry S.Warren,Jr(带详细书签).pdf

    7.3 转置位矩阵 128 7.4 压缩算法(广义提取算法) 136 7.4.1 用“插入”、“提取”指令实现压缩操作 140 7.4.2 向左压缩 141 7.5 展开算法(广义插入算法) 141 7.6 压缩与展开操作的硬件算法 142 7.6.1 压缩 ...

    计算机组成原理与汇编语言程序设计课后习题及解答(详解).doc

    (2)依靠多位数字的组合,在表示数值时可获得很宽的表示范围以及很高的精度。 (3)数字化的信息可以存储、信息传送也比较容易实现。 (4)可表示的信息类型与范围及其广泛,几乎没有限制。 (5)能用逻辑代数等...

    各数据类型的有效数字和精度.docx

    数据类型字符长,取值范围详解,结合自己学过的课程,认真去写的,你们给个1积分也不过分吧,别想白嫖了,恶心心的摘要,非要50字。默认所有的整型变量都是 signed 的,也就是带符号位的。   对于 int 类型的变量...

    电容的电路符号及图片识别

    电容器的容量(即储存电荷的容量),耐压值(指在额定温度范围内电容能长时间可靠工作的最大直流电压或最大交流电压的有效值)耐温值(表示电容所能承受的最高工作温度。).

    cmd操作命令和linux命令大全收集

    操作详解 net use ipipc$ " " /user:" " 建立IPC空链接 net use ipipc$ "密码" /user:"用户名" 建立IPC非空链接 net use h: ipc$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H: net use h: ipc$ 登陆后...

    DOS批处理高级教程精选合编-整理

    12、20080325修正dos数值计算范围:-2147483648至2147483647,即-2^31~2^31-1 13、20080326增加随机数的应用 14、20080327修改了“if增强用法”中的defined语句说明 15、20080402增加变量嵌套与命令嵌套,重要...

    基础电子中的TDK贴片电容详解

    TDK公司生产的电容分为好多种比如有TDK贴片电容、TDK薄膜电容器、TDK陶瓷电容器等等。下面我们主要讲的是TDK贴片电容。  TDK贴片电容的特点有:  1、随着陶瓷电介质的薄层化和积层技术的进步,连电解电容领域也...

    dos批处理教程(实用)

    号和一些完成指定功能的命令组合而成,那么在批处理中有多少这样的特殊符号和功能命令 呢?我们现在就来仔细了解一下一些最常用的! (以下内容来源网络,请各位仔细阅读,好进入下节的实例说明) =======================...

Global site tag (gtag.js) - Google Analytics