繁体   English   中英

int64_t溢出问题

[英]Int64_t overflow problem

我在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。

谢谢你的帮助。

您应该将文字显式转换为int64_t

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

因为1024 * 1024 * 1024 * 4文字是int ,不是int64_t

您将结果分配给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位。

当您在C ++表达式中编写“ 1024”时(例如您的问题中的一个),您将编写一个整数文字 ,其大小为4个字节,即32位(例如其类型为intunsigned int ),因此最后一个乘法4会使4字节整数溢出。 尝试以下方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM