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

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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top