c-有符号整数的算术右移



C99规范规定:

E1>>E2的结果是E1右移E2位位置。如果E1是无符号类型,或者E1是有符号类型和非负值,则结果的值是E1/2^E2商的整数部分。如果E1具有带符号类型和负值,则生成的值是实现定义的。

我很想知道,哪些实现/编译器不会将有符号的E1 >> 31视为一堆11111....

大多数用于微控制器的嵌入式编译器倾向于逻辑移位(零移位),而不是算术移位(符号位移位)。

这可能是因为有符号的数字在嵌入式系统中有些罕见,因为与使用屏幕的桌面编程相比,这种编程更接近硬件,离用户更远。

毕竟,有符号数字不过是用户演示而已。如果你不需要向用户打印号码,那么你根本不需要经常使用签名号码。

当然,一开始就对有符号的数字使用shift并没有任何意义。在我的编程生涯中,我从未遇到过需要这样做的情况。这意味着在大多数情况下,这样的转变只是偶然的错误。

您可以使用无符号类型模拟有符号的2的补码算术右移,而无需使用if语句。例如:

#include <limits.h>
unsigned int asr(unsigned int x, unsigned int shift)
{
    return (x >> shift) | -((x & ~(UINT_MAX >> 1)) >> shift);
}

您可能需要在代码中使用不同的无符号类型及其关联的最大值。

最新更新