Int64_t溢出问题

时间:2011-09-18 14:56:35

标签: c++ eclipse g++

我在Windows 7上使用Eclipse CDT - Cross G ++ Complier(MinGW / msys),这是我的代码:

int64_t y = 1024 * 1024 * 1024 * 4;
std::cout << "type id: " << typeid(y).name() << "; value: " << y << "; size of y: " << sizeof(y) << std::endl;

(IDE警告:“整数溢出”。)

输出是:

"type id: x; value: 0; size of y: 8"

我不明白,为什么y的大小是8个字节但值是0。

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

您应该明确地将文字投射到int64_t

int64_t y = (int64_t)1024 * 1024 * 1024 * 4;

1024 * 1024 * 1024 * 4字面值为int,而不是int64_t

答案 1 :(得分:2)

您将结果分配给int64_t这一事实无关紧要。重要的是,当您将int类型的两个值相乘时,结果也会显示类型int。由于1024,1024,1024和4都是int类型的常量,因此生成的临时产品计算为int,它会溢出。

解决方案是使这些常数中的至少一个成为int64_tint64_tint的乘积为int64_t,因此64位将在整个产品中级联。您可以使用显式强制转换或整数后缀

来执行此操作
int64_t y = (int64_t)1024 * 1024 * 1024 * 4;  // explicit cast
int64_t y = 1024ll * 1024 * 1024 * 4;  // integer suffix 'll'

整数常量后面的后缀ll(或等效LL)表示“此值实际为long long”。还有ull(或ULL)后缀,用于unsigned long long。另请注意,C语言标准保证long long至少为64位。

答案 2 :(得分:1)

当你在C ++表达式中编写“1024”时,就像问题中的那个一样,你写了一个整数文字,其大小为4个字节,即32位(就像它的类型一样) intunsigned int),因此最后乘以4会使4字节整数溢出。试试这个:

int64_t y = ((int64_t)1024) * 1024 * 1024 * 4;