一段奇怪的数字 2019-11-08 18:40 采纳率: 50%
浏览 1299
已采纳

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条)

报告相同问题?

悬赏问题

  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发