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

时间:2017-12-25 14:27:53

标签: c

在下面的代码中,sizeof(int)将生成signed int,其值为4个字节(假设在特定编译器上),-1也是signed int,那么我的答案应为,但会显示

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

1 个答案:

答案 0 :(得分:6)

这是着名的签名无符号比较。这里-1与无符号数字相比是有符号数字 - 提升为无符号数,导致幅度值很大(SIZE_MAX)。所以它总是错误的。

解释为什么在比较时会有类型推广的原因:

来自标准§6.3.1.8

  

否则,如果具有无符号整数类型的操作数具有等级   那么,大于或等于另一个操作数的类型的等级   带有符号整数类型的操作数转换为   具有无符号整数类型的操作数。

同样来自关系运营商下的§6.5.8

  

如果两个操作数都有算术类型,则通常算术   转换已完成。

返回什么尺寸?

在sizeof和_Alignof运算符§6.5.3.4

  

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

在通用定义

下的§7.19部分
  

size_t,它是sizeof结果的无符号整数类型   操作者;

要在将-1转换为size_t时进一步明确说明,它将具有值(基本上为模SIZE_MAX+1

SIZE_MAX+1+(-1)

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

  

涉及无符号操作数的计算永远不会溢出,因为   无法用结果无符号整数表示的结果   type是以大于最大值的数量减少的模数   可以由结果类型表示的值。