隐式转换在什么时候发生在C ++表达式中?

时间:2014-02-27 03:50:02

标签: c++ standards operator-precedence implicit-cast

这是一个非常简单的问题。我注意到,在MSVS2012中编译时,以下内容为0x3412生成预期的结果val

unsigned char test[] = { 0x12, 0x34, 0x56, 0x78 };
unsigned char* ch = test;
unsigned int val = *ch | (*(ch+1) << 8);

我实际上期望右边的解除引用的char指针*(ch+1)产生{em> char 值0x34,然后将其向左移8位产生{{ 1}}。似乎在该值被解除引用的时间点,它已经存储在足够大的类型中以包含至少两个字节。

这是在 C ++ 标准中指定的吗?这种隐式演员究竟是怎么发生的?

1 个答案:

答案 0 :(得分:4)

这包含在draft C++ standard部分5.8 Shift运算符 1 中,其中包含:

  

[...]操作数应为整数或无范围的枚举类型,并进行整体促销。[...]

整体促销涵盖在 1 段落中的4.5 整体促销部分中:

  

除了bool,char16_t,char32_t或wchar_t之外的整数类型的prvalue,其整数转换等级(4.13)小于int的等级,如果int可以表示所有的值,则可以转换为int类型的prvalue。来源类型;否则,源prvalue可以转换为unsigned int类型的prvalue。