C++:按变量值而不是数字移位 ->有什么区别?

C++: Shift by variable value instead of number -> whats the difference?

本文关键字:gt 区别 什么 变量值 数字 C++      更新时间:2023-10-16
int value = 0xffffffff;
int len = 32;
int result = value << len; // result will be 0xffffffff
result = value << 32; // result will be 0x0

为什么会有所不同?

编辑:对不起,我犯了一个错误。在上面的示例中,两个结果都0xffffffff。所以看看这个:

unsigned int value = 0xffffffff;
unsigned int len = 32;
printf("0x%xn", value << len); //will print 0xffffffff
printf("0x%xn", 0xffffffff << 32); //will print 0x0

如果int的大小为 32 位或更小,则代码包含未定义的行为。 位数移位必须大于或等于 0,且严格小于正在移动的内容中的位数。

在实践中可能发生的情况是,对于变量,编译器可能只是将其传递给机器仅考虑 5 个低阶位(即32 的情况下为 0);当班次计数为常量时,编译器在内部计算表达式(可能在long long中),然后截断它。 但这只是一种可能行为;就语言而言,任何事情都可能发生关心。

如果len >= sizeof(int)len < 0,代码包含未定义的行为。

有关更多详细信息,请参阅此答案。