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,有人可以解释为什么吗?
与所有整型常量一样,整型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)