一段奇怪的数字
2019-11-08 18:40
采纳率: 60%
浏览 1.1k

C语言取补码时,补码符号位要不要取反?

都说在取补码时除了符号位,其余位取反加1。
那大侠们请帮我解答一下-127,是不是我的理解有什么问题
首先-127的源码是 -111 1111,补齐8位的话就是 -0111 1111
,如果符号位不取反再加一就是 -0000 0001,那这明显不对啊

只能是符号位也跟着取反然后加一才对
-0111 1111 取反然后加一。 -1000 0001
但这样一来又是129了。懵逼...求高手解惑。
图片说明

-----------分隔号--------

图片说明

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • @矛盾综合体 2019-11-08 20:12
    已采纳

    首先先简单科普一下,为什么会有补码,因为刚开始计算器是由加法器构成的,但是加法器可以实现加和乘,无法实现减和除,所有引入补码,这一概念
    然后来一个一个回答你的疑问。
    首先-127的源码是 -111 1111,
    这句话暂时看上去没有错,求-127的原码,确实先应该求其绝对值的原码,也就是7个1,但是由于其是符号数,最高位应该为1(正数为0,负数为1,最高位作为符号位)
    补齐8位的话就是 -0111 1111
    这里开始就理解有点混乱了,补齐应该是1111 1111,计算机内部只有1和0,是没有-这个概念的,所有用最高位的变化来代表符号,这才是真正的原码
    然后原码取反,(注意作为符号位是不会变化的),变成反码:1000 0000,然后反码+1变成补码,也就是1000 0001,这就是-127的补码,计算机内部
    真正存储的01代码形式。
    最后总结一下
    负数的补码=原码取反+1(注意符号位不取反)
    正数的补码=原码=反码
    随便补充一下
    8位二进制原码的表示范围:-127~+127
    8位二进制反码的表示范围:-127~+127
    8位二进制补码的表示范围:-128~+127
    至于为什么是这么多,可以顺便找找博客,这方面的博客很多
    如有错误或者有什么疑问,欢迎一起讨论

    评论
    解决 无用
    打赏 举报
查看更多回答(2条)

相关推荐 更多相似问题