【发布时间】:2014-06-01 02:18:03
【问题描述】:
我在使用 unsigned long long 时遇到了一些奇怪的问题。
当我设置一个 unsigned long long 时会发生这种情况(我使用了 size_t,但是这个问题可以用 u-l-l 重复)。我已将其设置为 2^31,但由于某种原因,它恢复为 18446744071562067968 或 2^64 - 2^31。请记住,我使用的是 x64 编译:
unsigned long long a = 1 << 31;
cout << a;
//Outputs 18446744071562067968, Expected 2147483648
我以为 u-l-l 的极限是 2^64-1?那么为什么不能存储 2^31 呢? 2^30 工作得很好。 Sizeof(a) 返回 8,如果我没记错的话是 64 位,证明了 2^64-1 的限制。
我正在 Visual C++ 2013 Express Desktop 上编译。
我唯一的猜测是这是某种溢出错误,因为它不适合正常的长类型。
【问题讨论】:
-
提示:
1<<31是一个int表达式。不长,不是未签名。 -
谢谢,这解释了限制......那么还有另一种方法可以在 long long 上执行二进制操作吗?
-
1ULL
-
或
long long n = 1; long long a = n << 31;类型如uint64_tfromstdint.h保证整数的长度。 -
要记住的是,表达式(包括子表达式)的类型通常由表达式本身决定,而不是由它出现的上下文决定。
标签: c++ visual-c++ integer-overflow unsigned-long-long-int