2017-07-02 103 views
2

为什么下面的代码给出整数溢出警告:长整数溢出

#include <stdio.h> 

int main() 
{ 
    long long int x = 100000 * 99999; 
    return 0; 
} 

而下面的代码工作完美:

#include <stdio.h> 

int main() 
{ 
    long long int x = 100000000000000; 
    return 0; 
} 
+4

您正在乘以“int”值(不是两个“long long”值) – gawi

+3

来自[整数字面值引用](http://en.cppreference.com/w/cpp/language/integer_literal):* “整数文字的类型是值可以适合的第一个类型”* - 因此在这种情况下'int' – UnholySheep

+0

但是在任何一种情况下,我只是分配数字。在两种情况下,结果都应该是相同的,因为第一种情况下的乘法结果少于第二种情况下的乘法结果。 – user3243499

回答

4

因为这里

long long int x = 100000 * 99999; 

2个整数倍增。请尝试

long long int x = 100000LL * 99999; 
+0

谢谢。我只是尝试1LL * 100000 * 99999,它的工作。但100000 * 99999 * 1LL没有工作。现在我明白了你的观点。谢谢。 – user3243499

+1

@ user3243499事实上,因为'100000 * 99999 * 1LL'被评估为'(100000 * 99999)* 1LL',并且括号中的表达式是两个“int”的乘积。 – AlexD

+0

到目前为止,我的误解是在C/C++中,最终的大小将始终等于表达式中的最大大小。 – user3243499

1

使其成为100000LL * 99999LL,以使警告消失。

0

您应该阅读thisthis

的类型整数文字的是其中值 可以适合,从依赖于哪个数字基 和其中使用整数后缀的类型列表中的第一类型。

(感谢@UnHolySheep谁让我注意到它)。 如果您希望编译器解释不同的文字,您必须添加后缀。例如,对于int,可以添加LLll以指定它是long long int。使用无符号数字后缀为u

浮点文字,这是相同的:有一个默认的类型,这是double,但如果你想有一个float您可以方便地使用f(或f)后缀。有了浮点数,你甚至可以使用指数表示式(使用e)。

+1

*“默认情况下,整数文字(常量)的类型为int”* - 不,您是否自己阅读了第二个链接?整数常量或可以容纳它们的第一个类型,它恰好在OP的情况下是'int'。如果数量足够大,无法保存在'int'中,则选择下一个更大的类型(如果该数字不能保存,则可以选择下一个更大的类型,等等) – UnholySheep

+0

您是对的,我的不好。现在我改变它。 –