(1) int b = -1;
printf("%u %d\n", b, b); // 2^32-1 -1
-1补码:
取绝对值:1
0000 0000 0000 0000 0000 0000 0000 0001
取反:
1111 1111 1111 1111 1111 1111 1111 1110
+1:
1111 1111 1111 1111 1111 1111 1111 1111 // -1的补码%u打印:
无符号转换成原码:正数的原码、补码、反码是一样
1111 1111 1111 1111 1111 1111 1111 1111 // 2^32-1%d打印:
有符号转换成原码:-1的原码转成补码的逆操作
1111 1111 1111 1111 1111 1111 1111 1111 // -1的补码
-1:
1111 1111 1111 1111 1111 1111 1111 1110
取反:
1000 0000 0000 0000 0000 0000 0000 0001
(3) unsigned char c = 255;
char d = 255;
printf("%d %u\n", c, c); // 255 255
printf("%d %u\n", d, d); // -1 2^32-1
255的补码:
0000 0000 0000 0000 0000 0000 1111 1111 // 255
d的补码:(以%d打印)
1111 1111 1111 1111 1111 1111 1111 1111
-1:
1111 1111 1111 1111 1111 1111 1111 1110
取反:
1000 0000 0000 0000 0000 0000 0000 0001 // -1
d的补码:(以%u打印)
1111 1111 1111 1111 1111 1111 1111 1111 // 正数的原码、补码一样