如何将长位移位超过32位?

时间:2010-03-08 20:20:06

标签: c++ c

如果移位的左操作数很长,似乎我应该能够在C / C ++中执行超过32位的位移。但这似乎不起作用,至少使用g ++编译器。

示例:

unsigned long A = (1L << 37)

给出

A = 0

这不是我想要的。我错过了什么或者这是不可能的吗?

-J

7 个答案:

答案 0 :(得分:26)

A等于0,因为A只有32位,所以当然你将所有位都移到左边,只留下0位。你需要制作一个64位:

unsigned long long A = (1ULL << 37);

或者如果您打算使用Visual C ++:

unsigned __int64 A = (1ULL << 37);

答案 1 :(得分:13)

使用uint64_t类型的变量(来自stdint.h)而非long重试此操作。 uint64_t保证长度为64位,并且应该按预期运行。

答案 2 :(得分:10)

嗯,这取决于类型long的实际大小(更准确地说,它的宽度的位数)。您的平台上最有可能long的宽度为32位,因此您得到0(另请参见下面的P.S ..)。使用更大的类型。可能long long

P.S。另外需要注意的是,将类型移位的位数多于其宽度(或相等的位数)会在C和C ++中产生未定义的行为(C ++使用术语 length 而不是宽度)。因此,我们无法保证在0宽度为32的平台上1L << 371L << 32都不会long

答案 3 :(得分:2)

您确定您的特定操作系统和编译器的长度是64位吗?使用stdint.h并尝试这样:

#include <stdint.h>

uint64_t x = (1ULL << 37);

答案 4 :(得分:0)

新C ++标准为整数文字引入了LL和ULL后缀。您可以尝试使用它们,因为所有最新的编译器都支持它们。但是你应该知道它不是当前C ++标准的一部分。

long long A = (1LL << 37)

答案 5 :(得分:0)

在您的情况下,您仅限于语言基础类型。 [准]任意大小整数的通用解决方案是使用Integer下的Crypto++类。

答案 6 :(得分:-1)

你有相反的论点。

unsigned long A1 = (1L << 37); // is 2 to the 37th 
unsigned long A = (37UL<<1UL); // has just multiplied 37 by 2