关于内存里的补码和负整数之间的相互转换问题

大扣子 2011-11-23 01:26:37
十进制负整数转变为 内存里的补码的方法是 求原码的反码再加1得出补码

那内存里的补码转变为十进制负整数的方法,为什么是先求补码的反码再减1,而不是先减1再求反码得出原码(这样子才是根据负数到补码的反过来算啊)

求个详细解释啊大虾们。。非常感谢。
...全文
98 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
大扣子 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 goldbeef 的回复:]
(一)假如一个整数x用n位表示,则所求补码的二进制值是:(1)x>=0 [x]补=x;(2)x<=0,[x]补=2^n-|x|,
说明|x|是x的绝对值的意思
假设n是8,即整数用八位表示, [3]补=0000 0011 ;
[-3]补=2^8-|-3|,又因为2^8=1111 1111 + 1; 3=0000 0011;所以2^8-|-3|相当于1111 1111 -0000 001……
[/Quote]

哈哈真没明白,同样感谢。
大扣子 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lida2003 的回复:]
可以看看这个和引用的资料。

http://blog.csdn.net/lida2003/article/details/6973469
[/Quote]

非常感谢,你写的资料我先收藏了。
goldbeef 2011-11-23
  • 打赏
  • 举报
回复
(一)假如一个整数x用n位表示,则所求补码的二进制值是:(1)x>=0 [x]补=x;(2)x<=0,[x]补=2^n-|x|,
说明|x|是x的绝对值的意思
假设n是8,即整数用八位表示, [3]补=0000 0011 ;
[-3]补=2^8-|-3|,又因为2^8=1111 1111 + 1; 3=0000 0011;所以2^8-|-3|相当于1111 1111 -0000 0011 +1,即各位取反再加1
(二)补码转化为整数,根据(一)的公式很容易得到(1)x>=0 x=[x]补;(2)x<=0,|x|=2^n-[x]补,==>x=-|x|
由补码判断整数是正数还是负数只需看其最高位是0(则是正数)还是1(则是负数),例子如下
a,[x]补=0000 0011,最高位是0,则是正数,所有根据x>=0 x=[x]补=0000 0011=3;
b,[x]补=1111 1101,最高位是1,则是负数,
根据x<=0,|x|=2^n-[x]补,==>x=-|x|=-(1111 1111-1111 1101 +1)=-3

LZ明白了吧,哈哈


lida2003 2011-11-23
  • 打赏
  • 举报
回复
可以看看这个和引用的资料。

http://blog.csdn.net/lida2003/article/details/6973469

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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