C语言中连乘的问题

intmain(){longlonga;a=118302463*8*512;//a=118302463*8//a*=512;printf("a=%I64d",a);}为什... int main(){
long long a ;
a= 118302463 * 8 * 512;
//a = 118302463 * 8
//a *= 512;

printf("a = %I64d",a);

}
为什么这两种方式得到的结果会不一样?
展开
 我来答
阿冬76
2015-07-22 · TA获得超过5028个赞
知道大有可为答主
回答量:2710
采纳率:88%
帮助的人:1105万
展开全部
原因是这样的:
第一种方法是三个整数连乘,这三个整数的取值范围都在int能够表示的范围内,连乘的结果C语言仍然采用int容纳,但实际上这三个数的连乘结果已经超出了int能够表示的范围,于是变成了负数,最后把这个负数送给a变量存储;
第二种方法分成两个阶段,第一个阶段先计算前两个数的乘法,结果能够用int正常表示,然后存储到a这个long long类型的变量中,第二步用a再乘以512,注意此时是一个long long类型的变量与int类型的变量相乘,C语言会把int提升为long long,然后再计算,所以此时可以得到正确的结果。
金色潜鸟
2015-07-22 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5750万
展开全部
注意 long int 和 long long int 的允许数值范围不同
注意常数的书写,默认常数 是 long int.
下面 用 MS VC++ 6.0 的 long long 形式书写:
118302463i64 是 long long 整数。
main()
{
_int64 a,b ;
a= 118302463i64 * 8 * 512;
printf("a = %I64d\n",a);
b = 118302463i64 * 8i64;
b *= 512i64;
printf("b = %I64d",b);
}
得:
a = 484566888448
b = 484566888448
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风若远去何人留
2015-07-22 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450135
专业C/C++软件开发

向TA提问 私信TA
展开全部
你的是什么编译器?运行出什么结果?
我用gcc跑 结果是一样的。
a = -764416000
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式