看如下代码:
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、b、c在内存中的存储都是11111111这样的形势进行存储
int main() {
char a = -1;
//11111111
//有符号的char第一位是符号位,
//在进行以%d进行打印的时候,会发生整形提升
//进行整形提升之后
//11111111111111111111111111111111 补码
//打印的时候以原码的形式进行输出
//10000000000000000000000000000001 原码
//所以有符号的char输出的结果是1
//signed char 和char的结果分析是一样的,就不做分析
signed char b = -1;
//11111111
unsigned char c = -1;
//11111111 补码
//在进行%d进行打印的时候会进行整形提升
//无符号的char进行整形提升的时候,第一位不做符号位
//进行整形提升之后变成
//00000000000000000000000011111111 补码
//正数的原码反码补码相同
//所以无符号位输出的结果是255
printf("a=%d,b=%d,c=%d", a, b, c);
return 0;
}