| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5592 人关注过本帖
标题:[求助]-32769如何求补码
只看楼主 加入收藏
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
以下是引用moonwalker在2007-3-18 17:09:28的发言:
补码运算进行取反加1是不操作符号位的,具体过程请看我4楼的解释

哦,是我说错了,我求负数的补码时比较习惯先求其绝对值的原码


雁无留踪之意,水无取影之心
2007-03-18 19:45
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 

求负数补码的步骤:
(1)先求出其相反数的原码,这题中为10000000000000001.
(2)全部取反(包括符号位),即为01111111111111110
(3)再加1,即为01111111111111111(这就是-32769的补码)

所以-32769的补码就是01111111111111111

你也可以用%d试着输出-32769(不要用VC编译器,在VC中INT为32位),结果应该是32767.


雁无留踪之意,水无取影之心
2007-03-18 19:54
wozaixuec
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-3-16
收藏
得分:0 

楼上的不应该是相反数而是绝对值

2007-03-18 20:29
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
以下是引用PcrazyC在2007-3-18 19:45:06的发言:

哦,是我说错了,我求负数的补码时比较习惯先求其绝对值的原码

我在4楼的回答也是错误的,我的最后回答在14楼


“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2007-03-18 20:29
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
以下是引用wozaixuec在2007-3-18 20:29:17的发言:

楼上的不应该是相反数而是绝对值

负数的相反数和其绝对值有区别吗?


雁无留踪之意,水无取影之心
2007-03-18 20:34
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
以下是引用moonwalker在2007-3-18 20:29:33的发言:

我在4楼的回答也是错误的,我的最后回答在14楼

抱歉,14楼是错的,看22楼


雁无留踪之意,水无取影之心
2007-03-18 20:35
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
以下是引用PcrazyC在2007-3-18 20:35:41的发言:

抱歉,14楼是错的,看22楼

你的概念还是有问题,首先要理解原码的概念(下行红字):
数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了
来看22楼:
求负数补码的步骤:
(1)先求出其相反数的原码,这题中为10000000000000001./*-32769的相反数是+32769,你给的二进制少了个符号位0*/
/*所以应该是010000000000000001*/
(2)全部取反(包括符号位),即为01111111111111110 /*全部取反是101111111111111110*/
(3)再加1,即为01111111111111111(这就是-32769的补码)
/*再加1是 101111111111111111*/
你的方法没有错,可是你理解的不对,结果碰巧对是因为现在正好是在溢出的情况
所谓溢出就是因为容量限制丢失了本来是合法的位。
你看你的解释一直都是合法操作,如何体现溢出呢?


“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2007-03-18 20:53
wozaixuec
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-3-16
收藏
得分:0 

根据教材和上面各位的回答
上面的问题应该是这样
当一个负数小于-32768
符号位是应该取反的
而当这个负数大于等于-32768时
求补码是应该是符号位不变

不知道这样对吗?请高手验证一下

2007-03-18 20:54
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
你算原码、补码的操作和你数的大小没有关系,你需要注意的只是不要让数据溢出
我们一直在讨论的都是非法的赋值
随手找了个算原码补码的文章,可以看看
http://dev.csdn.net/develop/article/17/17680.shtm

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2007-03-18 20:59
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 

唉,好像还是我的问题,多谢moonwalker了,我看了一下书,14楼是正确的.

以前一直没有注意原码和反码也有正负之分的,以为只有补码才有正负之分,不过这样处理所有问题都是正确的,一样不会出现错误,因为最终存在内存中的是补码,我甚至有点觉得原码和反码没有正负之分还好一点.免得还要被那个符号位拉着到处转


雁无留踪之意,水无取影之心
2007-03-18 21:18
快速回复:[求助]-32769如何求补码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017353 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved