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

标签 c++ c

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%x\n", value << len); //will print 0xffffffff
printf("0x%x\n", 0xffffffff << 32); //will print 0x0

最佳答案

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

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

关于C++:按变量值而不是数字移位 ->有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22809618/

相关文章:

c++ - 可变参数模板和 switch 语句?

c++ - 使用英特尔编译器构建 boost 库

javascript - 寻找将非转义字符串转换为转义字符串的工具

一个进程可以同时在两个信号量上调用 "down"吗?

c++ - Windows-7/64 位上的免注册 COM 对象

c++ - 发送 POST 请求

c - 需要帮助了解如何使用 get char 在终端中输入句子

c - Valgrind 错误结构

c - 简单 C 子/父程序中的意外终止

c - C语言中int8_t变量始终为0