1

如果得到以下代码:

uint8_t value   = 0xF0;
uint16_t shift  = 0x10;
uint32_t result = value << shift;

cout << "The Result is: " << result << endl;

我预计输出为 0,但它是 15728640。

我的问题

  • 不是表达式评估 => 0 之后隐式转换为结果类型吗?
  • 这是行为标准吗?
  • 我在哪里可以获得有关这种行为的更多信息?
4

3 回答 3

2

当您编写value << shift,时value隐式转换为int移位之前。这称为“整数提升”。没有其他规则适用于这种特殊情况。

整数提升适用于范围适合int. 如果它不适合一个int,则unsigned int尝试。如果两者都不适合,那么整数提升什么也不做。

有关更多信息...好吧,我刚刚阅读了规范。

于 2012-11-26T13:41:13.113 回答
1

移位操作涉及“整数提升”,这意味着将比 int 更窄的类型转换为 int。促销是在轮班之前完成的,因此您看到的行为是预期的。

于 2012-11-26T13:41:06.757 回答
0

如果您正在使用 32 位或 64 位字机,则移位将在 32 位或 64 位寄存器中。也就是说,将 8 位“值”加载到寄存器中,移位,然后(如果需要)截断为最终变量。

这就是为什么“int”的长度取决于实现。

于 2012-11-26T13:45:41.520 回答