2012-11-26 105 views
1

如果得到了下面的代码中的地方:什么时候隐式类型转换采取转让

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

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

我预计的输出为0,而是它是15728640.

我的问题

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

回答

2

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

整数升级适用于范围在int范围内的任何类型。如果它不适合int,则尝试unsigned int。如果它不能兼容,那么整数提升什么也不做。

欲了解更多信息......以及我只是阅读规范。

1

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

0

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

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