c - 为什么全宽移位对于常量和变量的行为不同?
问题描述
如果我使用3 << 32
,我会得到正确的结果。如果我使用 找到大小sizeof(int)
,乘以 8,将结果存储在变量中,然后使用3 << variable
,我会得到不同的结果。我在这里想念什么?
void func()
{
unsigned int sz = sizeof(number) * 8;
unsigned int k = 0;
printf("Value of sz is %u \r\n",sz);
k = (k | (0x3) << sz);
printf("Value of 2_1_MSB is %d \r\n",(3 << 32));
printf("Value of k is %u \r\n",k);
}
解决方案
C 标准仅针对小于被移位类型宽度的移位定义移位行为 (C 2018 6.5.7 3)。int
标准未定义将 32 位移位32 位。
3 << 32
和之间的差异(0x3) << sz
可能是由于编译器在编译时评估前者(可能使用将所有位移出的操作,导致为零)和后者在执行时(可能使用仅使用低五位的指令)移位量,导致无移位)。不得依赖此类行为;它们可能会随着优化、目标或其他编译器配置的改变、编译器版本的改变等而改变。
推荐阅读
- javascript - 想要在 window.onload 中使用 javascript 函数
- python - 嘿,我正在编写一个程序来解码 morse_code 并遇到一个错误,if 语句被忽略
- node.js - 我想知道如何使用 sequelize 但没有 sequelize.query 来执行特定的 SQL
- java - jBPM 业务应用程序:无法获取 REST 服务器(错误 500)
- javascript - ES6 私有方法可以访问“this”关键字 JavaScript 习惯用法
- python - 在控制台上运行其他命令时,如何在 ipython 中运行 PyQt 而不会冻结 GUI?
- web-scraping - 在给定主页的情况下查找子页面
- css - CSS:让 div 超出其部分的底部
- python - 使用turtle模块编写代码绘制矩形
- python - 使用 while 循环而不是 for 循环遍历两个列表