看如下代码:
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;//11111111unsigned char c = -1;//11111111 补码//在进行%d进行打印的时候会进行整形提升//无符号的char进行整形提升的时候,第一位不做符号位//进行整形提升之后变成//00000000000000000000000011111111 补码//正数的原码反码补码相同//所以无符号位输出的结果是255printf("a=%d,b=%d,c=%d", a, b, c);return 0;
}