int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("%d,%d,%d", a, b, c);
return 0;
}
输出的是多少?
答案是-1,-1,255
解析:
int main()
{
char a = -1;
//-1的原码:10000000 00000000 00000000 00000001
//char类型导致裁剪后的原码: 00000001
//补码:11111111
//由于要打印出的%d是int类型,所以需要整形提升(符号位是1):11111111 11111111 11111111 11111111
//打印出的原码:10000000 00000000 00000000 00000001->为-1
signed char b = -1;
//同上,因为类型默认为signed
unsigned char c = -1;
//补码:11111111
//整形提升(无符号,以0补上):00000000 00000000 00000000 11111111
//打印出的原码(正数与补码相同):00000000 00000000 00000000 11111111—>256
printf("%d,%d,%d", a, b, c);
return 0;
}
总结:
1.要先将-1的二进制写出再放入char中,而不是直接用char打出-1的二进制
10000000 00000000 00000000 00000001(-1的原码)------->00000001(放入char) (√)
10000001(直接在char中放入-1) (×)
2.原反补码的应用:存储补码,打印原码
原码-反码-补码-剪切
3.有符号与无符号的整形提升
拓展
若改为printf("%u",a,b,c),答案是多少?
答:a=2的33次方-1
b=2的33次方-1
c=256
解析:
1.%u是指打印出无符号的整数,因此在整形提升过后,不需要转为原码了,无符号原反补码相同
2.整形提升是按照自身类型的有无符号来进行的,不是说打印%u类型就是按照无符号进行整形提升