wozaixuec 发布留言 2007-3-18 16:38
[求助]-32769如何求补码
int a;
a=-32769
-32769在内存中怎么放 如何求补码
10000000000000001
11111111111111110
11111111111111111
这样求不对
谁能帮忙解释一下 谢谢PcrazyC 发布留言 2007-3-18 16:40
注意是取反加1,取反的时候要全部反过来wozaixuec 发布留言 2007-3-18 16:54
不是要保留符号位吗?
moonwalker 发布留言 2007-3-18 17:01
你定义的是int,-32769已经溢出了,过程是这样的
首先32769是1000000000000001(注意是17位,但是只存放低16位)
这样就剩下000000000000001(16位)
因为你的是负数,所以编译器进行补码运算
取反(注意,最高位是符号位不取反):0111111111111110
加1: 0111111111111111
这就是最后在内存中的存放方式
所以最后结果是32767
可以用如下程序验证:
int main()
{
int a;
a=-32769;
printf("%d",a);
}
结果是32767,over! PcrazyC 发布留言 2007-3-18 17:01
谁说的,全部反就是了.符号位也要反
不要认为反了后,输出的时候符号就不同了,因为输出的时候,如果符号位是1,他会认为是负数,还是要将补码转换为原码,这个过程中也反了moonwalker 发布留言 2007-3-18 17:04
楼上不对!PcrazyC 发布留言 2007-3-18 17:05
哪错了,欢迎批评
moonwalker 发布留言 2007-3-18 17:09
补码运算进行取反加1是不操作符号位的,具体过程请看我4楼的解释wozaixuec 发布留言 2007-3-18 17:17
32769是16位吧
moonwalker 发布留言 2007-3-18 17:20
那我的思路也有问题,我再看下cxsw 发布留言 2007-3-18 17:22
这里应该他是循环的从32767在加一就产生了溢出,这杨应该有返回了-32768
是这样一直循环的!!wozaixuec 发布留言 2007-3-18 17:23
刚学在这个问题上晕忽忽的cxsw 发布留言 2007-3-18 17:23
有错误,清指出moonwalker 发布留言 2007-3-18 17:37
重新看了看后,我认为是这样的:
首先得到32769的原码1000 0000 0000 0001(16位)
由于是负数,进行补码运算:
1、前面补符号位1 =>1 1000 0000 0000 0001
2、除了符号位之外取反=>1 0111 1111 1111 1110
3、包括符号位加1 =>1 0111 1111 1111 1111
4、放入内存,丢失最高位1 得到正数32767
这次不知道对不对,高手来确认一下wozaixuec 发布留言 2007-3-18 17:39
关键是他是如何返回-32768
我想知道运算
过程wozaixuec 发布留言 2007-3-18 17:46
回复:(moonwalker)重新看了看后,我认为是这样的:...
谢谢各位的回答
这个看起来是没有问题
但还是希望高手把什么时候要保留符号未什么时候不保留符号位 什么时候要补上符号位
没有看到资料上有补符号位的相关问题moonwalker 发布留言 2007-3-18 17:49
没看懂15楼的问题,这个返回的不是-32768,是+32767,或者你想问-32768怎么返回?
wozaixuec 发布留言 2007-3-18 17:51
我那个回的是11楼 时间差 呵呵
xianlin_lea 发布留言 2007-3-18 18:03
[em03]
我觉得各位不必过份苛求对计算过程的追究!
而且是要充分理解一下补码的"补"的含义:在有限的字长所能表达的绝对值最大的整数与所要求的负数的绝对值之间的差值!进而将"-"运算转化为"+"运算!
比如:现有时间是九点,而你的表只显示七点,当你要调对表的时间必然有两种方法,一是顺时针拨2(即+2);二是逆时针拨10(即-10).在这里可以说2就是10的"补"(即将"-10"运算转化为"+2"运算)
所以,当一个数超过了有限字长所能表达的数时,硬要将其划为"补"的形式,势必产生错误(无论你的方法是否正确!)无玩过界 发布留言 2007-3-18 18:38
一般为1最高位是表示负数,这不是理论上问题,而是机器问题。