gpt4 book ai didi

c - 为什么 -1 >> 1 和 0xFFFFFFFF >> 1 会产生不同的结果?

转载 作者:太空狗 更新时间:2023-10-29 16:52:58 31 4
gpt4 key购买 nike

我正在尝试通过将十六进制 FFFFFFFF 右移 1 来判断我的 PC 是否执行算术右移或逻辑右移。

我知道整数 -1 在十六进制中读作 FFFFFFFF,因为它是 1 的二进制补码。将 -1 右移 1 结果为 FFFFFFFF 并显示 PC 执行了算术右移。

但如果我只输入 0xFFFFFFFF >> 1,它会导致 7FFFFFFF 并显示 PC 执行了逻辑右移。为什么会这样?查看下面产生结果的代码:

#include    <stdlib.h>
#include <stdio.h>

int main ( int argc, char *argv[] )
{
printf ( "%x >> 1 = %x\n", -1, -1 >> 1 );
printf ( "%x >> 1 = %x\n", 0xffffffff, 0xffffffff >> 1 );

return EXIT_SUCCESS;
}

程序的输出是:

ffffffff >> 1 = ffffffff
ffffffff >> 1 = 7fffffff

最佳答案

这不是假设。您认为 0xffffffff 是什么类型?根据C标准,6.4.4.1整型常量十六进制常量表达式的类型(前面有0x) 是以下第一个可以适用地保存表示值的:

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int

在您的平台上,0xFFFFFFFF 不能表示为 int,因为 int 是 32 位,只有 31 位表示 signed int 中的数量(标准规定一位保留用于符号)。因此使用下一个类型 unsigned int。因此,没有符号位可以通过移位操作进行扩展,因此这是逻辑的而不是算术的。

我如何得出 int 在您的平台上是 32 位的结论可能并不明显。事实上,如果不是 first 行,我无法做出这样的假设,该行算术右移 -1 的值。该转换的结果(转储为 %x)是 0xFFFFFFFF。如果 int 是 native 64 位,则应该转储 0xFFFFFFFFFFFFFFFF。如果没有这些先验知识,则无法假设 0xFFFFFFFF 的单一类型结论,因为它可以很好地表示为宽度为 64 位 (63+1) 的标准带符号 int0x00000000FFFFFFFF。由此产生的转变将产生与您现在看到的相同的输出,从而引入了上述假设的替代方案。

关于c - 为什么 -1 >> 1 和 0xFFFFFFFF >> 1 会产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24666567/

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