C++ 带64位整数的移位

C++ 带64位整数的移位,c++,c,visual-studio-2010,64-bit,shift,C++,C,Visual Studio 2010,64 Bit,Shift,我有一个uu int64变量x=0x80000000000000 我尝试按字节右移:x>>4 我原以为结果应该是0x080000000000000,但不幸的是我得到了0xf800000000000 我使用VS10。为什么会这样?我怎样才能解决这个问题呢?这是因为你有一个负数。在换班前使用(或转换为)无符号。这是因为您有一个负数。在换班前使用(或转换为)无符号。尝试使用\uuUINT64变量x=0x80000000000000 我想你也可以这样声明: u64 x = 0x8000000000000

我有一个uu int64变量
x=0x80000000000000

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

我原以为结果应该是
0x080000000000000
,但不幸的是我得到了
0xf800000000000


我使用VS10。为什么会这样?我怎样才能解决这个问题呢?

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

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

尝试使用
\uuUINT64变量x=0x80000000000000

我想你也可以这样声明:

u64 x = 0x8000000000000000;
x>>4
您将提供:

0x0800000000000000

有关MSB中的
F
的更多信息,请参阅。

尝试使用
\uuUINT64变量x=0x80000000000000

我想你也可以这样声明:

u64 x = 0x8000000000000000;
x>>4
您将提供:

0x0800000000000000

有关
F
在MSB中的位置的更多信息,请参阅。

嗯,这很简单。:)

你的号码已经签名了。设置第一位时,它是负数。因此,为了使其保持负值,它用1填充


我假设将其强制转换为unsigned,然后将其移位可以解决您的问题。

嗯,这是一个简单的问题。:)

你的号码已经签名了。设置第一位时,它是负数。因此,为了使其保持负值,它用1填充


我假设将其强制转换为无符号,然后将其移位可以解决您的问题。

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

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 

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

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 

原因是,只有当左操作数至少为0时,移位有符号数才由语言定义。在您的例子中,我假设它是一个2补表示,并且您的数字是负数,因此未指定结果(或者定义了实现,我手头没有引用)。通常,您会得到逻辑移位或算术移位


如果您可以使变量不带符号,这将解决您的问题。

原因是,只有当左操作数至少为0时,移位有符号数才由语言定义。在您的例子中,我假设它是一个2补表示,并且您的数字是负数,因此未指定结果(或者定义了实现,我手头没有引用)。通常,您会得到逻辑移位或算术移位


如果您可以使变量不带符号,这将解决您的问题。

您应该阅读。看起来您可能想要一个无符号值-
\uuuint64
,我猜?@CarlNorum-将0x80000000000000定义为无符号合法吗?-它的MSB=1
0x80000000000000
,与所有十六进制文字一样,从定义上讲,从一开始就是无符号的。您的赋值/初始化正在将其转换为有符号。@CarlNorum这不太正确,没有后缀的十六进制或八进制常量的类型是
int
unsigned int
long int
unsigned long int
中的第一个,
无符号long-long-int
,其中可以表示常量的值(如果有)<代码>0x80000000000000通常具有类型
无符号长
无符号长
。@Daniel-对。对不起,我记错了。在这种情况下,正如您所提到的,它几乎肯定是未签名的。您应该阅读。看起来您可能想要一个无符号值-
\uuuint64
,我猜?@CarlNorum-将0x80000000000000定义为无符号合法吗?-它的MSB=1
0x80000000000000
,与所有十六进制文字一样,从定义上讲,从一开始就是无符号的。您的赋值/初始化正在将其转换为有符号。@CarlNorum这不太正确,没有后缀的十六进制或八进制常量的类型是
int
unsigned int
long int
unsigned long int
中的第一个,
无符号long-long-int
,其中可以表示常量的值(如果有)<代码>0x80000000000000通常具有类型
无符号长
无符号长
。@Daniel-对。对不起,我记错了。在这种情况下,正如您所提到的,几乎可以肯定是无符号的。将0x80000000000000定义为无符号合法吗?-将0x80000000000000定义为无符号合法吗?-将0x80000000000000定义为无符号合法吗?-将MSB=1(负数)从有符号整数的左侧输入的位已定义为实现。不保证维护该标志。将无符号向右移动保证会滑入零,但将有符号向右移动可能滑入零或符号位。有符号整数上从左进入的位由实现定义。不保证维护该标志。将无符号向右移位保证会滑入零,但将有符号向右移位可能滑入零或符号位。