一、引言0源代码为00 00 00 00; 反码为00 00 00 00; 补数为00 00 00 00;
-0的源代码为80 00 00 00; 反码为FFFFFFFF; 补数为00 00 00 00;
用补数表示,0和-0相同,符合正常认知。
二、解释2.1、基础由此引出计算机中补数的表示规则:正数和零暂且不讨论,需要注意负数的转换规则。
讨论负数:
原码-补码符号的位不变,每位取倒后1;
补数-原始符号的比特不变,在-1之后逐比特反转;
如果用8位二进制表示有符号的数,-128的补数是0x10。 在将补数转换为原始码的规则中,不能保证不改变码的比特就能得到原始码。 于是我们得出了一个结论:
最小负数只有补码,不存在原码和反码
2.2、补充容易与单眼算子~ (取逆算子)和- (求补算子)混淆。 让我再举一个例子。 4位二进制表示的带符号数。
x=-4; (运算时均以补数的形式参与运算。
其原代码为1100; 反码为1011; 补数为1100;
对x进行求补运算(每位反取1 ),-x=~x 1; 即3358www.Sina.com/0001=0100(4)。
从上面的例子可以看出,x的补码是1100。补x的结果是0100,两者不同。
2.3、实例int i=-2147483648;
(k可以用二进制整数表示的状态有2^k种。 负数有2^(k-1 )个,正数和0共有2^(k-1 )个。 int型占4字节,负数为2^31个,最小负数为-2^31=-2147483648。 )
的补数为80 00 00 00; -1的补数为ff ff ff ff;
I-1的结果是什么? (-i ) )-1 )=将I的补充结果和1的补充结果相加;
– I=~i1=7f ff ff 00 00 01=80 00 00 00;
-1=~11=ffffFe00000001=ffffff;
合共7f ff ff ff=2147483647。
2.4、代码验证# include stdio.h # define int _ min (-2147483647-1 ) int main ) {int i=INT_MIN; printf(‘%d ‘,-i – 1 ); 返回0; }说明:要在代码中将-2147483648作为宏间接提供,请参阅将errorC4146:一元负运算符应用于无符号类型时,结果仍为无符号类型
执行结果