【问题标题】:Why does -1 >> 1 and 0xFFFFFFFF >> 1 produce different results?为什么 -1 >> 1 和 0xFFFFFFFF >> 1 会产生不同的结果?
【发布时间】:2014-07-10 02:29:15
【问题描述】:

我正在尝试通过将十六进制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

【问题讨论】:

  • -1 已签名。 0xffffffff 未签名。与printf()无关。
  • 右移负符号值是实现定义的:-1 &gt;&gt; 1 也可以打印为7fffffff

标签: c bitwise-operators bit-shift


【解决方案1】:

这不是假设。你认为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 位,而 signed int 中只有 31 位表示数量(标准规定为符号保留一位)。因此使用下一个类型unsigned int。因此,没有符号位可以通过移位操作进行扩展,因此这是逻辑而不是算术。

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

【讨论】:

    【解决方案2】:

    您的主要问题是:0xffffffff 是未签名的吗?

    来自 C11 §6.4.4.1 整数常量

    整数常量的类型是其值可以在对应列表中的第一个 被代表。

    第一行printf 的输出表明int 在您的机器上是32 位的。因此它不能代表0xffffffff,它必须是无符号的。

    【讨论】:

    • 此图中没有任何内容导致 0xffffffff 为 unsigned。推动结论的是 OP 的 -1
    • @chux 我明白你的意思,你是对的。但我不认为当 OP 询问它是否是无符号整数时,他的意思是 unsigned(即unsigned int)类型。我认为他的意思是一般的无符号类型,即unsigned intunsigned longunsigned long long。这就是为什么我没有使用代码格式unsigned,只使用unsigned
    • 0xffffffff 可能是 int(又名 signed int)应该 int 是 64 位。鉴于 C 规范。 0xffffffff 必须是 intunsigned intlong intunsigned long int
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2020-12-21
    • 2020-04-22
    • 2018-05-29
    相关资源
    最近更新 更多