- 原码:
- 给程序员看的;
- 反码:
- 用来做原码和补码转换;
- 补码:
- 数据是以补码的形式在计算机中存储;
- 三者关系:
- 无符号数值和有符号正数:
- 原码 == 反码 == 补码;
- 有符号负数:
- 反码 == 原码的数据位按位取反(即0变1、1变0),符号位不变;
- 补码 == 反码 + 1;
- 使用规则:
- 存储时看数据的正负,取出时看类型有无符号;
- 案例:
unsigned int a = 20;//int整型在内存中,占用4个字节(4 Byte == 32 bit)
//存储时:
//原码:0000 0000 0000 0000 0000 0000 0001 0100
//反码:0000 0000 0000 0000 0000 0000 0001 0100
//补码:0000 0000 0000 0000 0000 0000 0001 0100
//取出时:
//补码:0000 0000 0000 0000 0000 0000 0001 0100
//反码:0000 0000 0000 0000 0000 0000 0001 0100
//原码:0000 0000 0000 0000 0000 0000 0001 0100
printf("a == %d\n",a);//a == 20
signed int b = -20;
//存储时:
//原码:1000 0000 0000 0000 0000 0000 0001 0100
//反码:1111 1111 1111 1111 1111 1111 1110 1011
//补码:1111 1111 1111 1111 1111 1111 1110 1100
//取出时:
//补码:1111 1111 1111 1111 1111 1111 1110 1100
//反码:1111 1111 1111 1111 1111 1111 1110 1011
//原码:1000 0000 0000 0000 0000 0000 0001 0100
printf("b == %d\n",b);//b == -20
unsigned char c = -20;//char字符型在内存中,占用1个字节(1 Byte == 8 bit)
//存储时:
//原码:1001 0100
//反码:1110 1011
//补码:1110 1100
//取出时:
//补码:1110 1100
//反码:1110 1100
//原码:1110 1100
printf("c == %d\n",c);//c == 236
signed char d = 129;
//存储时:
//原码:1000 0001
//反码:1000 0001
//补码:1000 0001
//取出时:
//补码:1000 0001
//反码:1000 0000
//原码:1111 1111
printf("d == %d\n",d);//d == -127