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