原码、反码和补码
一个数有正负,这种数在计算机中称为有符号数,无符号数没有负数只有正数。
原码、反码和补码的概念是相对于有符号数来讲的。
有符号数的负数在计算机中的存储方式是以补码的形式存储的。
原码:最高位是符号位(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; }
编译链接后调试查看内存数据:
可以看到存储的是0xfb,那么换成二进制就是11111011,Python转换一下就可以证实: