为什么有符号字符的值大于无符号整数
#include <stdio.h>
int main() {
unsigned int i = 23;
signed char c = -23;
if (i<c)
puts("TRUE");
return 0;
}
为什么以下程序的输出为 TRUE,即使我使用了可以存储 -128 到 127 的有符号字符。
回答
您的i < c比较具有两种不同类型的操作数,因此具有较小类型(较低等级)的操作数将转换为另一个类型。在这种情况下,由于-23不能表示为unsigned int,并且在“通常的算术转换”之后,根据此(草案)C11的以下摘录中的第 2 段+23,最终将得到一个远大于(实际上,UINT_MAX + 1 - 23)的值标准:
6.3.1.3 有符号和无符号整数
1 当一个整数类型的值转换为_Bool以外的另一个整数类型时,如果该值可以用新类型表示,则不变。
2 否则,如果新类型是无符号的,则通过重复加或减一个新类型可以表示的最大值来转换该值,直到该值在新类型的范围内。
3 否则,新类型是有符号的,值不能在其中表示;要么结果是实现定义的,要么引发实现定义的信号。
您可以通过分配c给一个单独的unsigned int并打印其值来查看此转换,如下面的代码所示。假设是 32 位unsigned int,您可能会看到 的值4294967273(实际上大于23)。
#include <stdio.h>
int main()
{
unsigned int i = 23;
signed char c = -23;
unsigned int uc = c; // Add a diagnostic line ...
printf("%un", uc); // ... and show the value being used in the comparison
if (i < c) {
printf("TRUE");
}
return 0;
}
注意:这里的两个变量 (和)的相对大小有点牵强;即使你声明为,你仍然会得到相同的结果,因为通常的算术转换(链接由乔纳森莱夫勒的评论提供) - 请注意, a不能代表an 的所有可能值,所以最后一个“空心”项目符号将发挥作用。iccsigned int c = -23;signed intunsigned int