我一直遇到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,也不是 unsigned。 - n. m.1 << 31
会导致未定义的行为(如果 int 是32位)。虽然它在常见的实现中产生INT_MIN
,但这并不保证。 - M.M