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

saj*_*dkk -2 c++ integer sizeof

我有以下代码,

unsigned short code = 0x12E0;
code = code & 0x0FFF;
Run Code Online (Sandbox Code Playgroud)

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

“类型值int可能不适合接收者类型unsigned short

如果我这样说code &= 0x0FFF;,警告就会消失。

为什么它被0x0FFF视为int?是sizeof(0xF)4,有人可以解释为什么吗?

Lun*_*din 5

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

在表达式 中code & 0x0FFF,两个操作数code和都受到隐式整数提升(整数提升规则)0x0FFF的约束。这适用于小整数类型, 例如. 因此,无论其他操作数的类型如何,该操作数总是(至少)提升为。shortcodeint

因此,如果您这样做,您将会遇到同样的问题:

unsigned short code = 0x12E0;
unsigned short x = 0x0FFF;
code = code & x;
Run Code Online (Sandbox Code Playgroud)

编译器可能会抑制前两行中的警告,因为它只是简单的赋值。但最后一行有一个更复杂的表达式,整数溢出可能是一个问题。总体而言,编译器往往与此类警告不一致,因为它们不是强制性的。

迂腐但 100% 安全的代码,没有隐式类型转换,看起来像这样:

code = (unsigned short) ((unsigned int)code & 0x0FFFu);
Run Code Online (Sandbox Code Playgroud)