详情关于整型提升、算数转换与截断见文章:
《C语言:整型提升》
《C语言:算数转换》
一、代码一
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;printf("%d %d %d", a, b, c);
return 0;
}求输出结果
解析如下代码:
int main()
{
char a = -1;
//10000000 00000000 00000000 00000001原
//11111111111111111111111111111111111补
//11111111截断补(首位作符号位)
//11111111111111111111111111111111111整型提升补
//10000000 00000000 00000000 00000001整型提升原
signed char b = -1;
//10000000 00000000 00000000 00000001原
//11111111111111111111111111111111111补
//11111111截断补(首位作符号位)
//11111111111111111111111111111111111整型提升补
//10000000 00000000 00000000 00000001整型提升原
unsigned char c = -1;
//10000000 00000000 00000000 00000001原
//11111111111111111111111111111111111补
//11111111截断补(首位作普通位)
//11111111111111111111111111111111111整型提升补
//000000000000000000000000000011111111整型提升原
printf("%d %d %d", a, b, c);//-1 -1 255
return 0;
}
二、代码二
int main()
{
char a = -128;printf("%u\n", a);
return 0;
}求输出结果
解析如下代码:
int main()
{
char a = -128;
//10000000 00000000 00000000 10000000原
//11111111 11111111 11111111 10000000补
//10000000截断补(首位作为符号位)
//%u是打印十进制无符号数
//11111111 11111111 11111111 10000000整型提升补(先整型提升,最高位补符号位)
//11111111 11111111 11111111 10000000改无符号数补
//11111111 11111111 11111111 10000000改无符号数原
printf("%u\n", a);//4,294,967,168
return 0;
}
三、代码三
int main()
{
char a = 128;
printf("%u\n", a);
return 0;
}求输出结果
解析如下代码:
int main()
{
char a = 128;
//00000000 00000000 00000000 10000000原
//00000000 00000000 00000000 10000000补
//10000000截断补(首位作为符号位)
//%u是打印十进制无符号数
//11111111 11111111 11111111 10000000整型提升补(最高位补符号位)
//11111111 11111111 11111111 10000000改无符号数补
//11111111 11111111 11111111 10000000改无符号数原
printf("%u\n", a);//4,294,967,168
return 0;
}
四、代码四
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d", i + j);return 0;
}求输出结果
解析如下代码:
int main()
{
int i = -20;
//10000000 00000000 00000000 00010100原
//11111111 11111111 11111111 11101100补
//11111111 11111111 11111111 11101100算数转换补(符号位当做普通位)
unsigned int j = 10;
//00000000 00000000 00000000 00001010原
//00000000 00000000 00000000 00001010补
//i+j
//11111111 11111111 11111111 11101100(i算数转换后的补码)
//00000000 00000000 00000000 00001010(j补码)
//11111111 11111111 11111111 11110110(i+j后的补码)无符号数
//%d是打印十进制有符号数
//11111111 11111111 11111111 11110110(i+j后的补码)改有符号数
//10000000 00000000 00000000 00001010(i+j改有符号数后的原码)
printf("%d", i + j);//-10
return 0;
}
五、代码五
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}return 0;
}求输出结果
解析如下代码:
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
//无符号数9到0正常输出
//当i = 0循环执行结束时,i--即 i = i - 1, i = -1
//-1需要改为无符号数
//11111111 11111111 11111111 11111111 (-1的补码)
//11111111 11111111 11111111 11111111 (改无符号数后的补码)
//11111111 11111111 11111111 11111111 (改无符号数后的原码)
//结果:4,294,967,295
//i又从4,294,967,295开始递减
//每当i = 0循环执行结束时,i--又会回到4,294,967,295
//所以程序死循环
return 0;
}
运行结果如下,陷入死循环