我有一些代码,用左移运算符将各种长度(u8,u16,u32)的参数塞入u64中。

然后在代码的各个位置,我需要从这个庞大的参数中找回原始参数。

只是想知道在代码中如何在返回原始参数的同时确保它是逻辑右移而不是算术右移。

因此,问题是是否存在任何#defs或其他方法来确保并检查编译器是否会出错?

这是C++代码:

u32 x , y ,z;
u64 uniqID = 0;
u64 uniqID = (s64) x << 54 |
             (s64) y << 52 |
             (s64) z << 32 |
             uniqID;  // the original uniqID value.

然后,在取回值的同时:
z= (u32) ((uniqID >> 32 ) & (0x0FFFFF)); //20 bits
y= (u32) ((uniqID >> (52 ) & 0x03));     //2 bits
x= (u32) ((uniqID >> (54) & 0x03F));     //6 bits

最佳答案

一般规则是,逻辑移位适用于无符号二进制数,而算术移位适用于有符号2的补码。这将取决于您的编译器(gcc等),而不取决于语言,但是您可以假定编译器将对无符号数字使用逻辑移位...因此,如果您有无符号类型,则会认为它将是一个无符号类型。逻辑上的转变。

如果您需要在编译器之间进行某些移植,则始终可以编写自己的方法来进行检查和转换。或者,您可以使用嵌入式asm做到这一点并避免出现任何问题(但是您将被固定在平台上)。

简而言之,要100%正确,请检查您的编译器doco。

09-12 11:43