如果得到以下代码:
uint8_t value = 0xF0;
uint16_t shift = 0x10;
uint32_t result = value << shift;
cout << "The Result is: " << result << endl;
我预计输出为 0,但它是 15728640。
我的问题
- 不是表达式评估 => 0 之后隐式转换为结果类型吗?
- 这是行为标准吗?
- 我在哪里可以获得有关这种行为的更多信息?
当您编写value << shift
,时value
隐式转换为int
移位之前。这称为“整数提升”。没有其他规则适用于这种特殊情况。
整数提升适用于范围适合int
. 如果它不适合一个int
,则unsigned int
尝试。如果两者都不适合,那么整数提升什么也不做。
有关更多信息...好吧,我刚刚阅读了规范。
移位操作涉及“整数提升”,这意味着将比 int 更窄的类型转换为 int。促销是在轮班之前完成的,因此您看到的行为是预期的。
如果您正在使用 32 位或 64 位字机,则移位将在 32 位或 64 位寄存器中。也就是说,将 8 位“值”加载到寄存器中,移位,然后(如果需要)截断为最终变量。
这就是为什么“int”的长度取决于实现。