为什么有符号字符的值大于无符号整数

#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


以上是为什么有符号字符的值大于无符号整数的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>