原码:直接将数字按照正负数的形式表示成二进制即可;
反码:原码符号位不变,其他位按位取反即可;
补码:反码+1得到补码;
在计算机系统中,数值一律用补码来表示和存储。
#include <stdio.h>
int main()
{
//对于正数和无符号来说,原码=补码=反码
char a = -1; //截断后 整型提升时补1
printf("%u %d %x\n", a, a, a); //%u输出补码 %d输出原码
unsigned char b = -1; //截断后 整型提升时补0
printf("%u %d %x\n", b, b, b);
char d = -128; //截断后 整型提升时补1
printf("%u %d %x\n", d, d, d);
char e = 128; //截断后 整型提升时补1
printf("%u %d %x\n", e, e, e);
unsigned char f = 128; //截断后 整形提升时补0
printf("%u %d %x\n", f, f, f);
}
-1
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
截取: 11111111 ---存储
11111111 11111111 11111111 11111111 ---整型提升补1
00000000 00000000 00000000 11111111 ---无符号整形提升补0