这是一个非常简单的问题。我注意到,在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 ++ 标准中指定的吗?这种隐式演员究竟是怎么发生的?
答案 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。