Gcc 编译器会默认将 HEX 整数常量变量视为无符号整数吗?

Gcc compiler would default consider HEX integer constant variable as unsigned int?

#include<stdio.h>
int  main()
{
    int ret = -1071;

    if(ret == 0xfffffbd1)
        {
            printf("HAHAHA");
        }
    return 0;
}

为什么 GCC 编译器将 const 变量 0xfffffbd1 识别为 unsigned int 作为条件 ret == 0xfffffbd1

C 标准说 [t]整数常量的类型是相应列表中可以表示其值的第一个(第 6.4.4.1/5 段在 C99 中),对于没有后缀的十六进制类型,这个列表是:

  • int
  • unsigned int
  • long int
  • unsigned long int
  • long long int
  • unsigned long long int

假设一个32位的int类型,0xfffffbd1大于INT_MAX但小于UINT_MAX,所以常量的类型是unsigned int.

假设 32 位 int 类型 第一次: 我定义了一个 signed int ret = -1071 并执行表达式 ret == 0xfffffbd1,const 变量 0xfffffbd1 的默认类型是有符号整数(符号位为 1,为负数),因此表达式的结果为 TRUE 第二次 我更新了ret类型为long long int,令ret = -1071,执行表达式ret == 0xfffffbd1,表达式结果为FALSE,0xfffffbd1的默认类型为signed long long int(sign bit is 0, is a positive数),如果我将正确的值更新为 0xfffffffffffffbd1,表达式的结果将 return TRUE