鱼C论坛

 找回密码
 立即注册
查看: 2006|回复: 4

请教各位我怎样才能正确区分一个值是不是补码?

[复制链接]
发表于 2013-5-21 18:30:41 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 s0512 于 2013-5-25 15:24 编辑

如题:请教各位我怎样才能正确区分一个值是不是补码?

最佳答案

查看完整内容

一般补码针对有符号运算才有意义。无符号运算没有这个。有符号运算,最高位为1表示负数,最高位为0表示为正数,负数一般就用补码表示。比如说一个8位的char。能够表示的范围是-128~127 最高位为0为正,其他7为全部为1就是正数能够表示的最大的数,也就是127 为了让计算机方便计算正数和负数,这里有假设1+(-1) = 0;计算机只识别2进制的加减,所以必须要把-1转换成相应的一个二进制表示 使得(-1) + 1 = 0; 于是有补码。 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-21 18:30:42 | 显示全部楼层
一般补码针对有符号运算才有意义。无符号运算没有这个。有符号运算,最高位为1表示负数,最高位为0表示为正数,负数一般就用补码表示。比如说一个8位的char。能够表示的范围是-128~127
最高位为0为正,其他7为全部为1就是正数能够表示的最大的数,也就是127
为了让计算机方便计算正数和负数,这里有假设1+(-1) = 0;计算机只识别2进制的加减,所以必须要把-1转换成相应的一个二进制表示 使得(-1) + 1 = 0;
于是有补码。
什么数能够让0000001 +? = 00000000呢?
把00000001取反加1,11111111.用来表示-1;
11111111+00000001 = 00000000 产生的进位会纳入进位标志寄存器中暂时保存


想一眼看出一个有符号类型的值是不是补码表示的,最简单的方法是,把表示的值转换成正数 看是否超过了其能够表示的正数的最大值,如果超过了 就表示是用的补码表示的。
比如
short int a = 0xffff;
这里0xffff就是-1的补码表示。
0xffff转换成正数是2的17次方减去1 明显大于short int的正数范围,所以0xffff就是补码

希望这样解释 你能明白。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-21 18:40:38 | 显示全部楼层
没什么区别的 一个二进制数 可以是补码也可以是 原码,那要你自己怎么看!一般数据的保存都是二进制补码的!至于其他的 我就不是很清楚了,等待高手解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-21 20:50:40 | 显示全部楼层

太明白了!你解释得太好了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-22 21:07:24 | 显示全部楼层
2楼正解啊,哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表