如果移位的左操作数很长,似乎我应该能够在C / C ++中执行超过32位的位移。但这似乎不起作用,至少使用g ++编译器。
示例:
unsigned long A = (1L << 37)
给出
A = 0
这不是我想要的。我错过了什么或者这是不可能的吗?
-J
答案 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 << 37
和1L << 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)
答案 6 :(得分:-1)
你有相反的论点。
unsigned long A1 = (1L << 37); // is 2 to the 37th
unsigned long A = (37UL<<1UL); // has just multiplied 37 by 2