原码、反码和补码

一个数有正负,这种数在计算机中称为有符号数,无符号数没有负数只有正数。

原码、反码和补码的概念是相对于有符号数来讲的。

有符号数的负数在计算机中的存储方式是以补码的形式存储的。

原码:最高位是符号位(0表示正数,1表示负数),其余各位表示数值本身的绝对值。

反码:正数的反码就是原码本身;负数的反码符号位是1,其余各位对原码取反

补码:正数的补码也是原码本身;负数的补码符号位是1,其余各位对源码取反后+1

例如计算1的原码、反码和补码

1,确定数据宽度,假如是1个字节,那么就是8位,已知1是正数,那么最高位是0,即00000001。

2,计算原码,原码最高位是符号位,这里最高位是0,其余各位表示数值本身的绝对值,那1的原码就是00000001,是它本身。

3,计算反码,正数的反码就是原码本身,那么1的反码也是00000001。

4,计算补码,正数的补码也是原码本身,那么1的补码也是00000001。

例如计算-5的原码、反码和补码

1,确定数据宽度,假如宽带是1个字节,那么就是8位,已知-5是负数,那么最高位就是1,即10000101。

1,计算原码,原码最高位是符号位,这里是1,其余各位表示数值本身的绝对值,那么-5的原码就是10000101,是它本身。

2,计算反码,负数的反码最高位是符号位,是1,其余各位对原码取反,那么就是11111010,那么-5的反码是11111010。

3,计算补码,负数的补码最高位是符号位,是1,其余各位对原码取反+1,那么就是11111011,那么-5的补码就是11111011。

注意:开头提到了,有符号数的存储方式是以补码的形式存储的,那么下面我们可以验证一下

我这里使用vs2019进行验证,写几句代码:

#include <iostream>

int main()
{
    char x = -5;
    std::cout << "地址是:" << &x << std::endl;
}

编译链接后调试查看内存数据:

%title插图%num

可以看到存储的是0xfb,那么换成二进制就是11111011,Python转换一下就可以证实:

%title插图%num

发表回复