为什么应该在此代码中引入类型促销?

ani*_*ime 1 c

在下面的代码中sizeof(int)会产生signed int与4个字节的值(假设在一个特定的编译器)和-1signed int,则我的答案应该,但它显示没有.

#include <stdio.h>
int main()
{
    if (sizeof(int) > -1)
        printf("Yes");
    else
        printf("No");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

use*_*738 6

那是着名的签名无符号比较.这里-1是与无符号数相比的有符号数 - 提升为无符号数,从而产生较大的数值(SIZE_MAX).所以它总是错误的.

解释为什么在比较时会出现类型提升的原因:

从标准§6.3.1.8

否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型.

也来自关系运营商下的§6.5.8

如果两个操作数都具有算术类型,则执行通常的算术转换.

什么尺寸的回报?

在sizeof和_Alignof运算符§6.5.3.4下

两个运算符的结果的值是实现定义的,其类型(无符号整数类型)是size_t,在(和其他头文件)中定义.

在通用定义下的第7.19节中

size_t是sizeof运算符的结果的无符号整数类型;

为了澄清远一点当要转换-1size_t它的值将为(基本上为模SIZE_MAX+1)

SIZE_MAX+1+(-1)
Run Code Online (Sandbox Code Playgroud)

也来自标准§6.2.5(解释转换)

涉及无符号操作数的计算永远不会溢出,因为 无法通过生成的无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.