在C ++表达式中,隐式演员发生了什么位置?
-
23-12-2019 - |
题
这是一个非常简单的问题。我注意到,在MSVS2012中编译时,以下内容会生成0x3412
的val
的预期结果:
unsigned char test[] = { 0x12, 0x34, 0x56, 0x78 };
unsigned char* ch = test;
unsigned int val = *ch | (*(ch+1) << 8);
.
我实际上预期了右侧的未引人的char指针生成agodicetagcode生成生成的 char 值,然后将其移位左8位产生生成的*(ch+1)
。似乎在取消引用的值的时间点,它已经存储在足够大的类型中以包含至少两个字节。
是在某个地方的 c ++ 标准中指定的吗?这种隐式投射究竟是如何发生的?
解决方案
这是在 rel="nofollow">草稿c ++标准 Section 5.8
Shift Operators 段 1 ,它说:
[...]操作数应具有积分或未扫描的枚举类型和整数促销。[...]
和积分促销部分是属于4.5
积分促销,其中在 1 段落中:
除bool,char16_t,char32_t或wchar_t之外的整数类型的prvalue,其整数转换等级(4.13)小于int的等级,如果int可以代表所有值,则可以转换为int类型的int的prvalue源类型;否则,可以将源prvalue转换为无符号int类型的prvalue。
不隶属于 StackOverflow