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