【发布时间】:2021-08-22 07:03:18
【问题描述】:
在一段时间没有编码后,我再次尝试使用 C,但我遇到了一些关于位移的我不理解的东西。
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
void main()
{
uint64_t x = 0;
uint64_t testBin = 0b11110000;
x = 1 << testBin;
printf("testBin is %"PRIu64"\nx is %"PRIu64"\n", testBin, x);
//uint64_t y = 240%32;
//printf("%"PRIu64 "\n",y);
}
在上面的代码中,x 返回 65536,表示在位移 240 个位置后,1 现在位于 32 位寄存器的第 17 位,而我希望它位于第 49 位一个 64 位的寄存器。
我对@987654332@ 类型进行了同样的尝试,结果是一样的。
我试过编译有和没有m64 参数,都一样。
【问题讨论】:
-
欺骗Unexpected C/C++ bitwise shift operators outcome 或任何其他关于左移 >= 类型宽度的内容。我不明白你为什么期望移动 240 个位置来做任何有意义或可预测的事情。
-
您在代码中有两个问题:首先,
1 << testBin在您的 C 实现中可能是 32 位的int上运行,因为它使用1的类型,即 @ 987654337@,而不是分配给这个表达式的类型,uint64_t。其次,C 标准定义<<仅用于小于左操作数类型宽度的移位,对于int或uint64_t来说,240 太大了。您想要的正确表达式将设置左操作数的类型并以宽度为模减小右操作数,因此(uint64_t) 1 << testBin % 64;。 -
@underscore_d:这不是重复的,因为这个问题只回答了这里的两个问题之一。
标签: c bit-manipulation 32bit-64bit bit-shift