浏览 13088 次
锁定老帖子 主题:有符号的范围,-128~+127详解
精华帖 (1) :: 良好帖 (9) :: 新手帖 (10) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-04
原因没有在工作上或者是什么地方直接遇到它,所以我也一直忽略它,但心里总是有一根刺.直到刚才!!!! 就是刚才,无聊之极,在看汇编的书时,又遇到它了,但一如以往,书上直接地,有心地,明显地绕过了这个问题,真是可恶啊 几经周折,终于把它搞清楚了: 其实,它是计算机底层为了实现数值运算而决定的,涉及非常非常基础的原码,反码,补码知识,一般(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~ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-05-13
……你在大学里面的课程设计没有做过汇编的东西,或者需要涉及到位运算的东西(如文件校验和)么?也没有思考过为什么有反码还要用补码的原因?
刚刚翻了翻自己大学4年的课本,其中有介绍过补码的书有《C语言程序设计(谭浩强 第二版)》,《计算机科学导论》,《汇编语言程序设计教程》,《计算机组成与系统结构》。其中《导论》和《组成》都有0000-1111的补码十进制取值穷举,是楼主自己看书不仔细吧?或者是楼主的书都没有做过这个穷举? 我大3的两个课程设计都用到了补码,一个是用复杂模型机实现乘法运算,提供的指令非常少,只能把被乘数取反加1(相当于把正整数变成相应的负数补码),然后不断+1,判断是否产生进位来实现for循环. 另外一个是实现简单的文件校验和,就是把文件的相邻32位两两相加,生成个32位的校验码,我是用java做的,做出来之后发现,只要文件中含有中文就会算错.做了单步调试才发现是补码运算惹的祸,凡是大于127的字节都被转成负的,然后发现java里面根本就没有无符号类型(也就是不存在值大于127的byte类型),只能自己手工把负的byte转成正的int才能保证运算的正确. 感觉凡是涉及字节流的处理,就不可能不留意补码这些底层的东西吧. |
|
返回顶楼 | |
发表时间:2008-05-18
有符号就把范围分为正数和负数,0算正数,所以正数就知道127,这样理解呢,对吗
|
|
返回顶楼 | |
发表时间:2008-05-19
也可以这么理解,+0当0用,-0当-128用,
to 1楼,没你那么幸福,大学时偶是读种树养鱼的,电脑是在高中学的,然后就是全部自学,你说的那几本书,只看过那本C++,里面就随便说了一下-128~+127,根本没说为什么是-128,但我相信这在汇编的书籍里很容易找到,不过我第一次看的汇编书也就是在写这贴子前1,2小时 |
|
返回顶楼 | |
发表时间:2008-05-24
wyyl00 写道 有符号就把范围分为正数和负数,0算正数,所以正数就知道127,这样理解呢,对吗 不对.一个字节=8个位,把第一个位当作正负号,剩下7个位来表示数字大小,能表示的数字最大绝对值就是2的7次方=127 这种表示方法会有两个0,1000 0000和0000 0000,一个负的0一个正的0,会给运算带来不少麻烦,所以才要用补码这种看上去这么别扭的方案. |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2008-06-16
非科班的,看看深入计算机系统 这本书吧.
|
|
返回顶楼 | |
发表时间:2008-07-21
http://blog.csdn.net/java_seven_net/archive/2006/04/03/649007.aspx
|
|
返回顶楼 | |
发表时间:2008-10-29
这种问题,诸如整型,浮点型等等之类的数字在计算机内的表现形式,《计算机组成原理》花了整整一两章的篇幅来讲。
|
|
返回顶楼 | |
发表时间:2008-10-29
简单地说,8位二进制数(一个byte),总共能表示256个值,-128到+127正好是256个值,也就是二进制表示从10000000到01111111。
|
|
返回顶楼 | |