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);
}
为什么这两种方式得到的结果会不一样? 展开
long long a ;
a= 118302463 * 8 * 512;
//a = 118302463 * 8
//a *= 512;
printf("a = %I64d",a);
}
为什么这两种方式得到的结果会不一样? 展开
3个回答
展开全部
原因是这样的:
第一种方法是三个整数连乘,这三个整数的取值范围都在int能够表示的范围内,连乘的结果C语言仍然采用int容纳,但实际上这三个数的连乘结果已经超出了int能够表示的范围,于是变成了负数,最后把这个负数送给a变量存储;
第二种方法分成两个阶段,第一个阶段先计算前两个数的乘法,结果能够用int正常表示,然后存储到a这个long long类型的变量中,第二步用a再乘以512,注意此时是一个long long类型的变量与int类型的变量相乘,C语言会把int提升为long long,然后再计算,所以此时可以得到正确的结果。
第一种方法是三个整数连乘,这三个整数的取值范围都在int能够表示的范围内,连乘的结果C语言仍然采用int容纳,但实际上这三个数的连乘结果已经超出了int能够表示的范围,于是变成了负数,最后把这个负数送给a变量存储;
第二种方法分成两个阶段,第一个阶段先计算前两个数的乘法,结果能够用int正常表示,然后存储到a这个long long类型的变量中,第二步用a再乘以512,注意此时是一个long long类型的变量与int类型的变量相乘,C语言会把int提升为long long,然后再计算,所以此时可以得到正确的结果。
展开全部
注意 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
注意常数的书写,默认常数 是 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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的是什么编译器?运行出什么结果?
我用gcc跑 结果是一样的。
a = -764416000
我用gcc跑 结果是一样的。
a = -764416000
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询