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
#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