2个问题
首先,同时
long long int num = 1000000000000;
Run Code Online (Sandbox Code Playgroud)
工作良好
long long int num = 4014109449;
Run Code Online (Sandbox Code Playgroud)
给
warning: this decimal constant is unsigned only in ISO C90 [enabled by default]
Run Code Online (Sandbox Code Playgroud)
这是什么意思 ?
其次
long long int num = 1000000*1000000;
Run Code Online (Sandbox Code Playgroud)
发出溢出警告
long long int num = 1000000000000;
Run Code Online (Sandbox Code Playgroud)
没问题,即使它们是一样的.我如何摆脱它?乘法给出了垃圾值
Cli*_*ord 10
问题是该值在C90中4014109449是一个unsigned long int但long long int在C99中是因为它对于32位来说太大了long int.虽然1000000000000对于任何 32位类型都太大,但是自动a long long int.该警告涉及C90和C99之间的行为不同的事实.
解决方案是通过使用适当的类型后缀强制文字和变量类型之间的类型协议.在这种情况下:
long long num = 4014109449LL ;
Run Code Online (Sandbox Code Playgroud)
或使用类型转换:
long long num = (long long)4014109449 ;
Run Code Online (Sandbox Code Playgroud)
类似地,表达式1000000 * 1000000是两种int类型的乘法并且具有int结果,但是导致溢出 - 对于int表达式没有自动提升到更大的类型.解决方案再次明确关于文字的类型:
long long num = 1000000LL * 1000000LL;
Run Code Online (Sandbox Code Playgroud)
或者您也可以在一个或两个操作数上使用类型转换.
long long num = (long long)1000000 * 1000000;
Run Code Online (Sandbox Code Playgroud)