首先先看看代码:
#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;
}
代码很简单,问打印结果是什么?
下面我们来简单的分析一下,char a = -1;
-1在内存中存储的是补码。
-1的原码是:1000 0000 0000 0000 0000 0000 0000 0001
-1的反码是:1111 1111 1111 1111 1111 1111 1111 1110
-1的补码是:1111 1111 1111 1111 1111 1111 1111 1111 反码+1
char a接收-1的补码,由于char类型存储空间是1个字节8位,所以-1的补码要存储到char a中就要发生截断,把-1的补码从左到右数8位:1111 1111放到char a的空间内,后面要以十进制的方式打印a
就要发生整型提升,右侧补符号位,补到32位,结果为:
整型提升后a的补码:1111 1111 1111 1111 1111 1111 1111 1111
整型提升后a的反码:1111 1111 1111 1111 1111 1111 1111 1110 (补码-1)
整型提升后a的原码:1000 0000 0000 0000 0000 0000 0000 0001
此时最高位(符号位)为1,后面的值是1,所以按10进制的格式打印的结果就是-1.
下面分析 signed char b = -1,这个和上面的分析是一样的结果也是一样的。没有什么好说的了。
下面分析 unsigned char c = -1
-1在内存中存储的是补码。
-1的原码是:1000 0000 0000 0000 0000 0000 0000 0001
-1的反码是:1111 1111 1111 1111 1111 1111 1111 1110
-1的补码是:1111 1111 1111 1111 1111 1111 1111 1111 反码+1
unsigned char c接收-1的补码,由于unsigned char类型存储空间是1个字节8位,所以-1的补码要存储到unsigned char c中就要发生截断,把-1的补码从左到右数8位:1111 1111放到unsigned char c的空间内,后面要以十进制的方式打印c 就要发生整型提升,右侧补符号位,由于unsigned为无符号,补0到32位,由于无符号数存储的原码,反码,补码相同,结果为:
c:0000 0000 0000 0000 0000 0000 1111 1111
结果以十进制的格式打印就是255.
自己可以试试结果:a=-1 b=-1 c=255
#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;
}