[英]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位(例如其类型为int
或unsigned int
),因此最后一个乘法4会使4字节整数溢出。 尝试以下方法:
int64_t y = ((int64_t)1024) * 1024 * 1024 * 4;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.