比较值时数据溢出

Kam*_*mar 5 c

我对以下2个代码片段有疑问.

我在64位机器(x86_64-linux-gnu)上运行此代码.我可以看到Val数据类型的值溢出unsigned integer.

#include<stdio.h>
main()
{
    unsigned int Val = 0xFFFFFFFF-15, Val2 = 0xFFFFFFFF;
    if (Val+16 < Val2)
    {
        printf("Val is less than Val2\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果数据类型unsigned char不溢出.

#include<stdio.h>
main()
{
    unsigned char Val = 0xFF-15, Val2 = 0xFF;
    if (Val+16 < Val2)
    {
        printf("Val is less than Val2\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. Val当数据类型是unsigned char时,值是否被提升为高数据类型?
  2. 如果是,为什么它不能从32位升级到64位unsigned long

Ant*_*ala 6

C11标准如下(C11 6.3.11p2.2):

如果a int可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int; 否则,它被转换为unsigned int.这些被称为整数促销.整数促销不会更改所有其他类型.

从而:

  1. unsigned char将被提升 - 但是它是一个实现细节是否int可以代表所有的值unsigned char- 因此它可能会被提升到unsigned int这些平台上.你的不是那些平台之一,因此你的第二个比较是(int)Val + 16 < (int)Val2.

  2. 如引用段落的最后一句所述,a unsigned int永远不会被提升.由于算法是在第一个片段中对无符号整数进行的,因此结果0xFFFFFFFF - 15 + 160U在具有32位值无符号int的计算机上.