补码,在数学领域,是有严格定义的。
在定义式中,根本就没有“求反加一”的说法。
-------------------
在计算机系统中,数值,一律采用补码表示和存储。
原码和反码,都是不存在的。
补码,是怎么定义的?
就按照八位来说吧,其模,就是 2^8 = 256。
数值 0,在计算机中,显然是用 0000 0000 存放的。
数值-1 怎么存放?
毫无疑问,就是 0-1,你会怀疑吗?
你用 0000 0000 减去一,即可得到 1111 1111 (十进制 255)。
即使产生了借位,也是八位之外的,不必考虑。
由此即可得到:[-1]补码=256-1 = 255。
数值-2 怎么存放?
显然就是-1 再减一,你还有怀疑吗?
即可得到:[-2]补码=256-2 = 254 = 1111 1110。
。。。
数值-128 怎么存放?
当然就是:[-128]补码=128 = 1000 0000。
-------------------
按照上述规律,你自己,都可以总结出补码的定义式:
[ X ]补码=模 - | X |, X < 0。
你多看几本书,一定能看到这个定义式。
当然,书上也写了“原码取反加一。。。”。
只是,-128 并没有原码和反码,你拿什么“取反加一”?
-------------------
补码的来源,就是这么简单。
补码,与原码反码,没有任何关系。
取反加一,并没有理论依据。
鼓吹“取反加一”的人,不是上当受骗的,就是诚心想要骗人。
以-3为例,
[-3]原 = 1000 0011
[-3]反 = 1111 1100 原码除符号位外各位取反
[-3]补 = 1111 1101 反码末位加1
-3的补码减1得 1111 1100
再取反得 1000 0011
即为a1,a1也就是-3的原码。
-3的补码取反得 1000 0010
再加1得 1000 0011
即为a2,a2也就是-3的原码。
结论,负数的补码减1取反得原码,取反加1也得原码。
对于负整数-x,先写出x的二进制值,高位补0,补足8位或16位。
再写[-x]原=符号位变为1,后续位不变
[-x]反=符号位为1,其余位=原码各位取反(0,1互换)
[-x]补=[-x]反+1
这就和移位乘二除二一样...没什么道理好说的