【问题标题】:Shift with 64 bit int用 64 位整数移位
【发布时间】:2013-01-30 22:15:45
【问题描述】:

我有一个 __int64 变量 x = 0x8000000000000000

我尝试按字节右移:x >> 4

我认为结果应该是0x0800000000000000,但不幸的是我得到了0xf800000000000000

我使用 VS10。为什么会这样?我该如何解决?

【问题讨论】:

  • 你应该阅读sign extension。看起来您可能想要一个无符号值 - 我猜是 __uint64
  • @CarlNorum - 将 0x8000000000000000 定义为无符号是否合法? - MSB = 1
  • 0x8000000000000000 与所有十六进制文字一样,根据定义,一开始就是无符号的。您的分配/初始化正在将其转换为已签名。
  • @CarlNorum 这不太正确,不带后缀的十六进制或八进制常量的类型是intunsigned intlong intunsigned long intlong long int、@中的第一个987654333@,其中可以表示常量的值(如果有)。不过,0x8000000000000000 的类型通常为 unsigned longunsigned long long
  • @Daniel - 对。对不起,我记错了。在这种情况下,几乎可以肯定,正如您提到的那样,它是未签名的。

标签: c++ c visual-studio-2010 64-bit shift


【解决方案1】:

尝试使用__uint64 variable x = 0x8000000000000000

我想你也可以这样声明:

u64 x = 0x8000000000000000;

x >> 4你给你:

0x0800000000000000

请参阅F 在 MSB 中来自from 的更多信息。

【讨论】:

    【解决方案2】:

    原因是因为移位有符号数字仅在左操作数至少为 0 时由语言定义。在您的情况下,我假设它是二进制补码表示,并且您的数字为负数,因此结果未指定(或实现定义,我现在手头没有参考资料)。通常你会得到一个逻辑移位或算术移位。

    如果你可以让你的变量无符号,那将解决你的问题。

    【讨论】:

      【解决方案3】:

      嗯,这很容易。 :)

      您的号码已签名。设置第一位后,它是负数。因此,为了保持负数,用 1 填充。

      我认为将其转换为无符号然后将其转移应该可以解决您的问题。

      【讨论】:

        【解决方案4】:

        这是因为你有一个负数。在班次之前使用(或转换为)无符号。

        【讨论】:

        • 将 0x8000000000000000 定义为无符号是否合法?- 它的 MSB = 1(负数)
        【解决方案5】:

        有符号值右移符号位,无符号零:

        int _tmain(int argc, _TCHAR* argv[])
        {
            __int64  signedval;
            unsigned __int64  unsignedval;
        
            signedval=0x8000000000000000 >> 4;
            unsignedval=0x8000000000000000 >> 4;
        
                printf(" Signed %x  , unsigned %x   \n", signedval, unsignedval);
        
                getchar();
        
            return 0;
        }
        

        输出是:

        Signed 0  , unsigned 8000000 
        

        【讨论】:

        • 有符号整数从左侧进入的位是实现定义的。不保证保持标志。将无符号向右移动保证会滑入零,但将有符号向右移动可能会滑入零或符号位。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        相关资源
        最近更新 更多