详情关于整型提升、算数转换与截断见文章:
《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; }
运行结果如下,陷入死循环