谁能讲讲,-128 这个负数是如何转成补码的,每一步的过程:

ylwtsmt 2009-09-12 08:58:58
谁能讲讲,-128 这个负数是如何转成补码的,每一步的过程:

对于负数转补码,有些数我明白,先说个我明白了。比如:-5
首先-5的原码表示为:10000101
第一步,高位不动,其余位取反。得:11111010
第二步,对整个数加1,得:11111011
最终得到的是:11111011,这就是-5的补码。

但是对于 -128,确不好办了,你们看:
首先-128的原码表示为什么呢?(这我就不明白了,对于128,它的原码是:10000000,但是对于-128,它的原码是什么呢?没有原码,就无法求补码呀?)
假如-128的原码也是:10000000,
第一步:高位不动,其余位取反,得:11111111,
第二步,对整个数加1,得:100000000(最高位为1,要舍去,所以是:00000000)

所以不对呀,我错在哪里呢?
...全文
1584 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wizard_tiger 2011-02-20
  • 打赏
  • 举报
回复
楼上已经说的很清楚了,只能学习了。
jiangfaqun 2011-02-20
  • 打赏
  • 举报
回复
楼上都已经说的很清楚了 14楼正解。。。
blueviewer 2011-02-19
  • 打赏
  • 举报
回复
楼上几位说的反码的求法并不适合于字长范围的最小负数。其实我们通常说的“符号位不动其后各位取反再加1”是从模推出来的。补码的定义:[x]补
=x (0≤x<2^(n-1)
=2^n+x (-2^(n-1)≤x<0)
从这个定义出发就不难理解【-128】补=模+x=2^8-2^7=10000000B.
通常的做法只是为了减少运算量
traceless 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ylwtsmt 的回复:]
我是知道补码的如何定义的,否则也问不出这个问题来,
关键是,-128这个数比较特别,因为原码最大才是127,
可是将一个数转成补码,必须先知道它的原码,

关键是-128这个数的绝对值的原码不存在。

看来一些文章,看来-128比较特别,用取反加一是算不出来的,它只是一种规定,
实际是借用-0这个数的位置,我的理解对吗?

[/Quote]
Faint~~

还说对补码的定义清楚。。。
对于8位来说:
补码的范围是-128 - 127
原码的范围是:-127 - 127
在原码基础上取反加1,这个不是定义,是一种对绝大多数的数的总结。

也就是说补码和原码其实没什么关系

如果真正知道补码的定义的化,就直接通过定义来求每个数对应的二进制。补码的定义包含一个公式,这个
公式和那个经验总结不是一回事。
游钓侠 2010-02-02
  • 打赏
  • 举报
回复
原数:10000000
符号位不变其余按位取反 :11111111
再加1。。。。
jiangjuntang 2009-10-13
  • 打赏
  • 举报
回复
对于一般的数,补码确实是那么算的
但是 0是特殊的
0有+0和-0
对于+0 按符号位(第一位)不变,其余取反,加一为0 0000000
对于-0 为1 0000000
问题出来了 +0和-0为同一个值,只能用一个0 0000000
但1 0000000不能浪费 所以规定它为-128
所以八位二进制数范围为 -128到127
wanjingwei 2009-09-12
  • 打赏
  • 举报
回复
http://blog.chinaunix.net/u/12178/showart_243037.html
aizibion 2009-09-12
  • 打赏
  • 举报
回复
楼上正确,修正错误,确实是-128到127.。。
芒果仔 2009-09-12
  • 打赏
  • 举报
回复
我记得一个类型的范围不会是-128到128的,应该是-128到127
aizibion 2009-09-12
  • 打赏
  • 举报
回复
如果是字节型,不存在-128,字符型范围是-127。。。0.。。128,如果不是字符型,那也就不存在你说的情况了
gyang_pinner 2009-09-12
  • 打赏
  • 举报
回复
对于负数,先求出正数的二进制码!全部取反,加一即可
DISINHUI 2009-09-12
  • 打赏
  • 举报
回复
128=10000000
按位取反:01111111
加1 :10000000
没有溢出,因为没有别的数用10000000来表示.所以计算机系统默认该值表示128。
pengzhixi 2009-09-12
  • 打赏
  • 举报
回复
自己去搜索下补码是怎么一回事吧
q664906965 2009-09-12
  • 打赏
  • 举报
回复
原数:10000000
按位取反 :01111111
再加1:10000000
飞天御剑流 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 ylwtsmt 的回复:]
谁能讲讲,-128 这个负数是如何转成补码的,每一步的过程:

对于负数转补码,有些数我明白,先说个我明白了。比如:-5
首先-5的原码表示为:10000101
第一步,高位不动,其余位取反。得:11111010
第二步,对整个数加1,得:11111011
最终得到的是:11111011,这就是-5的补码。

但是对于 -128,确不好办了,你们看:
首先-128的原码表示为什么呢?(这我就不明白了,对于128,它的原码是:10000000,但是对于-128,它的原码是什么呢?没有原码,就无法求补码呀?)
假如-128的原码也是:10000000,
第一步:高位不动,其余位取反,得:11111111,
第二步,对整个数加1,得:100000000(最高位为1,要舍去,所以是:00000000)

所以不对呀,我错在哪里呢?
[/Quote]

你的错误在于,以为一个8位有符号数是有正128的,其实范围是-128~127,那个10000000其实不是128的原码,恰恰就是-128的原码,为什么呢,-127的原码是11111111,那么-128的原码就是符号位不变,数值部分加1,进位的部分去掉,就是10000000了。于是-128的补码就是原码取反加1,结果仍然是10000000,即-128的原码和补码是相同的。

目前使用的补码计算正式名称叫2的补码,实际上是一种移码,是从1的补码计算得来的(取反就是1的补码),目的是去掉负0。

但是,补码并不是C/C++有符号数表示的唯一方式,C/C++标准规定编译器可以从三种方式中选择其中一种:符号及数值表示法(sign and magnitude)、1的补码(one`S complement)和2的补码(two`S complement),即这是实现定义的,采用哪种方式由编译器的宿主环境决定了。符号及数值表示法和1的补码都会存在负0的情况,这个负0可以作为一个正常的值,也可以作为一个陷阱以产生环境相关的信号。摘录c99的内容:

6.2.6.2 Integer types

.........If the sign bit is zero, it shall not affect the resulting value. If the sign bit is one, the value shall be modified in one of the following ways:

— the corresponding value with sign bit 0 is negated (sign and magnitude);
— the sign bit has the value -(2N) (two’s complement);
— the sign bit has the value -(2N - 1) (one’s complement).

Which of these applies is implementation-defined, as is whether the value with sign bit 1 and all value bits zero (for the first two), or with sign bit and all value bits 1 (for one’s complement), is a trap representation or a normal value. In the case of sign and magnitude and one’s complement, if this representation is a normal value it is called a negative zero.
ylwtsmt 2009-09-12
  • 打赏
  • 举报
回复
我是知道补码的如何定义的,否则也问不出这个问题来,
关键是,-128这个数比较特别,因为原码最大才是127,
可是将一个数转成补码,必须先知道它的原码,

关键是-128这个数的绝对值的原码不存在。

看来一些文章,看来-128比较特别,用取反加一是算不出来的,它只是一种规定,
实际是借用-0这个数的位置,我的理解对吗?
wxdcxp 2009-09-12
  • 打赏
  • 举报
回复

按我的理解(上学时学c语言就是这样理解的,老谭那本书上讲整数的取值范围那段就有)
16位int -32768至32767 -2^(16-1)至 +2^(16-1)-1
:8位二进制的原值表达范围为:-127至127
共有256个组合序列 0000 0000 至1111 1111 。
+128的原值在8位中是表达不出来的。
我个人的理解是:
(1)、
应当从数学层面上去理解:


从数学上计算 256-128=128,
因为:256-128=256+(-128)的补码
而 256-128=128
所以 256+(-128)的补码=128
所以 (-128)的补码=256-128
=128
而从数学上, 128=1000 0000
故规定-128的补码为 1000 0000
所以说,128在8位内存中是表达不出来的。
不存在+128 8位原码及反码的形式,按常规算法是不对的。

注意:只是规定而已,下面还有原因。
(2)、


8位二进制 的补码组合序列有
0000 0000 - 0111 1111 0 - +127
1000 0000 用来干啥好呢?(表示-0,不是的,-0的原码是1000 0000 补码是
0000 0000 +0 的补码也是 0000 0000

1000 0001- 1111 1111 -1 - -127
全部状态为256个
再看看这个规律表
原码 补码 值
0111 1111 0111 1111 127
0111 1110 0111 1110 126
......补码不断-1........
0000 0000 0000 0000 0
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-+127,对16位32位64位等扩大范围)
先将该负数取绝对值,再用二进制表示出这个绝对值 (不管符号位)
对该二进制数进行取反加一操作就得到负数的补码了
-128 绝对值是 128
128的二进制表示为:
1000 0000
取反
0111 1111
加1
1000 0000
这就是-128的补码
这种办法算出的结果符合“规定值”,规定而已。


OenAuth.Core 2009-09-12
  • 打赏
  • 举报
回复



【楼主的学校不开计算机组成原理这门课????】



mstlq 2009-09-12
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090903/16/c4aa2135-57e8-40d0-bc01-bb892961ea1f.html
请楼主了解一下补码的真正定义^_^

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧