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

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

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

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

图片说明

3个回答

首先先简单科普一下,为什么会有补码,因为刚开始计算器是由加法器构成的,但是加法器可以实现加和乘,无法实现减和除,所有引入补码,这一概念
然后来一个一个回答你的疑问。
首先-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个关键诀窍在于:
(1)负数符号位为1,正数包括0是0
(2)画一个圆,为了简单,你可以从4位理解,在圆上画16个等分,类似时钟(时钟是12等分)。
依次顺时针写上 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
注意观察,对角线两个数相减的绝对值都是8(2的4-1次方),对角线两个数字正好是除了符号位,其余都相等。
因此,你可以得出结论,-127对角线的数字是1,1的原码是00000001,-127就是10000001

你可能对原码的定义有误解,八位的二进制原码其中有一位是表示数值的符号,所有八位的二进制原码表示范围为-128~127
所有-127应该表示为1111 1111第一位表示的是符号,然后按照补码为除符号位外取反加一,则为1000 0001,即为-1

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问