为什么sizeof(0xF)是4个字节?

时间:2017-03-13 11:31:53

标签: c++ integer sizeof

我有以下代码,

unsigned short code = 0x12E0;
code = code & 0x0FFF;

在我的CLion IDE中,我收到一条警告

  

"类型int的值可能不适合接收器类型unsigned short"

如果我把它像code &= 0x0FFF;那样,警告就消失了。

为什么将0x0FFF作为intsizeof(0xF)4,有人可以解释原因吗?

3 个答案:

答案 0 :(得分:4)

与所有整数常量一样,整数常量0x0FFF至少为int类型。但这并不重要。

在表达式code & 0x0FFF中,两个操作数code0x0FFF都受到隐式整数提升,整数提升规则。这适用于小整数类型,例如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是第一种适合的类型。

引用N1570/6.4.4.1p5

  

整数常量的类型是相应列表中可以表示其值的第一个。

      
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)

如果未附加任何特定后缀,则0x12E00x0FFF等整数常量的类型为int。它们将被归类为"十六进制常数"由于0x的前缀。

另外,如other answer中所述,对于没有明确后缀的整数常量(具体为" 八进制或十六进制常量"),类型将根据以下列表中排名类型

决定
  
      
  • int
  •   
  • unsigned int
  •   
  • long int
  •   
  • unsigned long int
  •   
  • long long int
  •   
  • unsigned long long int
  •   

可以保存(表示)值。

另外,出于某种原因,sizeof(0xF)sizeof(int)相同,恰好会在您的平台中产生4的结果。