前言
关于二进制原码、反码、补码和整型提升的运用
练习一
#include <stdio.h>
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1
printf("a=%d, b=%d, c=%d", a, b, c);
// 你知道输出结果是什么吗?
return 0;
}
解析:
上述输出结果为:a=-1, b=-1, c=255
int main()
{
首先我们先看-1的原反补码
10000000 00000000 00000000 00000001 - -1的原码
11111111 11111111 11111111 11111110 - -1的反码
11111111 11111111 11111111 11111111 - -1的补码
char a = -1; // char类型占据一个字节的内存空间
所以a地址中存储的二进制序列是:11111111
当我们打印时,因类型不同,所以要进行整型提升
整型提升:若有符号位,则高位补符号位,即为1
11111111 11111111 11111111 11111111 - 整形提升后的补码
10000000 00000000 00000000 00000001 - 整形提升后的原码 - 打印-1
signed char b = -1;
b地址中存储的二进制序列是:11111111
整型提升:若有符号位,则高位补符号位,即为1
11111111 11111111 11111111 11111111 - 整形提升后的补码
10000000 00000000 00000000 00000001 - 整形提升后的原码 - 打印-1
unsigned char c = -1;
c地址中存储的二进制序列是:11111111
整型提升:无符号位,则高位补0
00000000 00000000 00000000 11111111 整形提升后的补码 - 正数原反补相同
00000000 00000000 00000000 11111111 整形提升后的原码 - 打印255
return 0;
}
练习二
#include <stdio.h>
int main()
{
char a = -128;
// %u 输出无符号10进制整数
printf("%u", a);
// 你知道输出的结果吗?
return 0;
}
解析:
上述输出结果为:4294967168
int main()
{
首先我们先-128的原反补码
10000000 00000000 00000000 10000000 - -128的原码
11111111 11111111 11111111 01111111 - -128的反码
11111111 11111111 11111111 10000000 - -128的补码
char a = -128;
a地址中存储的二进制序列是:10000000
整形提升:若有符号位,高位补符号位,即为1
11111111 11111111 11111111 10000000 - 整型提升后的补码
因为打印的是无符号位的整数,把它当作正数,正数的原反补均相同,则输出结果为:4294967168
}