小编ide*_*ity的帖子

签名右移=奇怪的结果?

我正在帮助某人完成他们的功课,并遇到了这个奇怪的问题.问题是编写一个函数来反转有符号整数的字节顺序(这就是函数的指定方式),这就是我提出的解决方案:

int reverse(int x)
{
    int reversed = 0;

    reversed = (x & (0xFF << 24)) >> 24;
    reversed |= (x & (0xFF << 16)) >> 8;
    reversed |= (x & (0xFF << 8)) << 8;
    reversed |= (x & 0xFF) << 24;

    return reversed;
}
Run Code Online (Sandbox Code Playgroud)

如果传递0xFF000000给此函数,将导致第一个赋值0xFFFFFFFF.我真的不明白发生了什么,但我知道它与签名和未签名之间的来回转换有关,或类似的东西.

如果我附加ul0xFF它工作正常,我认为这是因为它被迫无符号然后转换为签名或在那个方向的东西.结果代码也会发生变化; 没有说明ul符它使用sar(右移算术),但作为无符号它使用shr按预期.

如果有人能为我阐明这一点,我将非常感激.我应该知道这些东西,我以为我做了,但我真的不确定这里发生了什么.

提前致谢!

c endianness undefined-behavior sign-extension

4
推荐指数
2
解决办法
3620
查看次数