我有以下代码,
unsigned short code = 0x12E0;
code = code & 0x0FFF;
在我的CLion IDE中,我收到一条警告
"类型
int
的值可能不适合接收器类型unsigned short
"
如果我把它像code &= 0x0FFF;
那样,警告就消失了。
为什么将0x0FFF
作为int
? sizeof(0xF)
是4
,有人可以解释原因吗?
答案 0 :(得分:4)
与所有整数常量一样,整数常量0x0FFF
至少为int
类型。但这并不重要。
在表达式code & 0x0FFF
中,两个操作数code
和0x0FFF
都受到隐式整数提升,整数提升规则。这适用于小整数类型,例如short
。因此,code
操作数始终被提升为(至少)int
,而不管其他操作数的类型。
因此,如果您这样做,您将得到同样的问题:
unsigned short code = 0x12E0;
unsigned short x = 0x0FFF;
code = code & x;
编译器可能会抑制前两行中的警告,因为它只是简单的赋值。但是在最后一行中有一个更复杂的表达式,整数溢出可能是一个问题。总的来说,编译器往往与这些警告不一致,因为它们不是强制性的。
迂腐但100%安全的代码,没有隐式类型转换,看起来像这样:
code = (unsigned short) ((unsigned int)code & 0x0FFFu);
答案 1 :(得分:3)
因为整数常量的类型被确定为第一个可以包含它的类型,而short只是在类型列表中不是。 int
是第一种适合的类型。
整数常量的类型是相应列表中可以表示其值的第一个。
Suffix | Decimal Constant | Octal or Hexadecimal Constant ------ | ---------------- | ----------------------------- none | int | int | long int | unsigned int | long long int | long int | | unsigned long int | | long long int | | unsigned long long int
该表明确指出int为第一种类型,而不是short
。
答案 2 :(得分:1)
如果未附加任何特定后缀,则0x12E0
或0x0FFF
等整数常量的类型为int
。它们将被归类为"十六进制常数"由于0x
的前缀。
另外,如other answer中所述,对于没有明确后缀的整数常量(具体为" 八进制或十六进制常量"),类型将根据以下列表中排名类型
决定
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
可以保存(表示)值。
另外,出于某种原因,sizeof(0xF)
与sizeof(int)
相同,恰好会在您的平台中产生4
的结果。