在C/C++中从64位值中获取32位字,而不用担心字节序

Jay*_*son 10 c c++ bit-manipulation endianness bitwise-operators

我的理解是,在C/C++中,按位运算符应该是字节独立的,并且表现得像你期望的那样.我想确保我真正从64位值中获得最重要和最不重要的单词,而不用担心机器的字节顺序.这是一个例子:

uint64_t temp;
uint32_t msw, lsw;
msw = (temp & 0xFFFFFFFF00000000) >> 32;
lsw = temp & 0x00000000FFFFFFFF;
Run Code Online (Sandbox Code Playgroud)

这会有用吗?

dir*_*tly 17

6.5.7按位移位运算符

4 E1 << E2的结果是E1左移E2位位置; 腾出的位用零填充.如果E1具有无符号类型,则结果的值为E1×2E2,比结果类型中可表示的最大值减少一个模数.如果E1具有有符号类型和非负值,并且在结果类型中可以表示E1×2E2,那么这就是结果值; 否则,行为未定义.

所以,是的 - 由标准保证.


AnT*_*AnT 5

它会起作用,但是一些作者在位移位之前进行位屏蔽的奇怪倾向总是让我感到困惑。

在我看来,一种更优雅的方法是先进行转变

msw = (temp >> 32) & 0xFFFFFFFF; 
lsw = temp & 0xFFFFFFFF; 
Run Code Online (Sandbox Code Playgroud)

至少因为它每次都使用相同的“魔法”位掩码常量。

现在,如果您的目标类型是无符号的并且已经具有所需的位宽,则完全不需要屏蔽

msw = temp >> 32; 
lsw = temp; 
Run Code Online (Sandbox Code Playgroud)