gpt4 book ai didi

c - 签名右移 = 奇怪的结果?

转载 作者:太空狗 更新时间:2023-10-29 15:10:13 24 4
gpt4 key购买 nike

我在帮助某人做作业时遇到了这个奇怪的问题。问题是编写一个函数来反转有符号整数的字节顺序(反正函数就是这样指定的),这是我想出的解决方案:

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;
}

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

如果我将 ul 附加到 0xFF 它工作正常,我认为这是因为它被强制为无符号然后转换为有符号或朝那个方向的东西。生成的代码也会更改;在没有 ul 说明符的情况下,它使用 sar(右移算术),但作为无符号的,它按预期使用 shr。

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

提前致谢!

最佳答案

x是一个有符号数量,(x & (0xFF << 24))的结果是 0xFF000000,它也是有符号的,因此是一个负数,因为顶部(符号)位已设置。 >> int 上的接线员(有符号值)执行符号扩展(编辑:尽管此行为未定义且特定于实现)并在值向右移动时传播符号位值 1。

您应该按如下方式重写函数以专门处理无符号值:

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

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

return reversed;
}

关于c - 签名右移 = 奇怪的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3763263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com