我在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。
感谢您的帮助。
答案 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_t
。 int64_t
与int
的乘积为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位(就像它的类型一样) int
或unsigned int
),因此最后乘以4会使4字节整数溢出。试试这个:
int64_t y = ((int64_t)1024) * 1024 * 1024 * 4;