【发布时间】:2015-07-20 20:42:36
【问题描述】:
#include<stdio.h>
int main()
{
long long int t=8*9*100000000;// 8 zeros
printf("%lld\n",t);
return 0;
}
给出结果: -1389934592
请回复
#include<stdio.h>
int main()
{
long long int t=8*9*1000000000; //9zeros
printf("%lld\n",t);
return 0;
}
给出结果: -1014444032
而所有其他乘法都给出了正确的结果,即
#include<stdio.h>
int main()
{
long long int t=8*9*10000000000; //10zeros or greater or zeros <=6
printf("%lld\n",t);
return 0;
}
给出结果: 720000000000
【问题讨论】:
-
由于有符号整数溢出导致的未定义行为未定义。任何事情都有可能发生。将 LL 与您的文字一起使用。
-
试试这个:
8LL*9LL*1000000000LL(9 个零) -
我认为讨论舍入结果比讨论未定义行为更好,结果在逻辑上由运算符类型维度定义,因为编译器将 100,000,000 视为 32 位整数,而不是 64 位作为类型long long int t。如果你使用
t=8 * 9* k;,行为是相同的,其中k是int k=100000000; -
@SergioFormiggini 浮点数发生舍入,整数根本不舍入。虽然这个结果对我们来说是合乎逻辑的,但在非双补设备或不同大小的设备上,结果会有所不同。它被指定为 undefined 是有原因的。
-
好的!已收到! ,,, 我没有考虑非双补设备! :p(四舍五入我的意思是截断,但你的解释清楚了我最好将这种情况一般视为未定义的行为)
标签: c memory int long-integer