鱼C论坛

 找回密码
 立即注册
查看: 2883|回复: 9

[已解决]两个int的乘积会在返回之前被截断成int???

[复制链接]
发表于 2017-10-7 10:52:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小蒙 于 2017-10-7 11:00 编辑

题目来自C primer plus 6th第六章复习题的13题。
屏幕快照 2017-10-07 10.51.58.png
答案如下:
long x(int i)
{
    return i * (long)i;
}

之所以要把形参强制转换成long,答案解析中是这么说的。
把i的类型强制转换成long,确保计算使用long而不是int,在int位16位的系统中,两个int类型值得乘积在返回之前会被截断成int,这可能丢失数据。


经过验证,确实如此。
int i = 2147483647;//i赋予最大值
long l = (long)i * i;
printf("%ld\n", l);
如果不加long强制转换,结果输出1,加了转换,结果正确,为4611686014132420609
最佳答案
2017-10-7 11:17:12
int * int 的结果是 int
所以溢出
int * long 结果是 long
所以没溢出

i*i 的类型 只和两个操作数的类型有关系
和你的函数返回值类型没关系
你返回值类型是long
只是把计算结果 转换成 long 而已
相当于return (long)(i*i);
i*i 溢出到了 1
相当于
return (long)1;
还是 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-7 10:54:25 | 显示全部楼层
嗯?你想问的是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-7 11:00:27 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-7 10:54
嗯?你想问的是什么?

正在编辑中。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-7 11:04:25 | 显示全部楼层
小蒙 发表于 2017-10-7 11:00
正在编辑中。。。

对呀,答案说的没错呀,就是怕i的数太大,导致int类型存不下,所以要把它转换为一个能存放大的类型,就能存放,不会导致数据的丢失呀。
至于转换就是像程序里的一样return i * (long)i;也可以return (long)i * i;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-7 11:06:21 | 显示全部楼层
这跟float 和 double 同理。float不强转double再计算 数值会越界。

意思是把计算后的结果给 long l 。至于你的结果是什么l 是不管的。  结果取决于 i * i 里面能容纳的最大数据类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-7 11:10:32 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-7 11:04
对呀,答案说的没错呀,就是怕i的数太大,导致int类型存不下,所以要把它转换为一个能存放大的类型,就能 ...
int i = 2147483647;
long l =i * i;
printf("%ld\n", l);
两个i相乘,如果按照i的取值范围看,乘积确实超出了int的取值范围,可是我定义的是long类型,long类型是可以存放下这个大小的乘积的,感觉你说的确实是计算机内部的真实情况,但是我想不到理论根据。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-7 11:17:12 | 显示全部楼层    本楼为最佳答案   
int * int 的结果是 int
所以溢出
int * long 结果是 long
所以没溢出

i*i 的类型 只和两个操作数的类型有关系
和你的函数返回值类型没关系
你返回值类型是long
只是把计算结果 转换成 long 而已
相当于return (long)(i*i);
i*i 溢出到了 1
相当于
return (long)1;
还是 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-7 11:20:30 | 显示全部楼层
我是师兄 发表于 2017-10-7 11:17
int * int 的结果是 int
所以溢出
int * long 结果是 long

感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-7 11:22:13 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-7 11:04
对呀,答案说的没错呀,就是怕i的数太大,导致int类型存不下,所以要把它转换为一个能存放大的类型,就能 ...

感谢前辈,对于初学者的我,7楼的解答我听得更明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-7 11:22:52 | 显示全部楼层
ba21 发表于 2017-10-7 11:06
这跟float 和 double 同理。float不强转double再计算 数值会越界。

意思是把计算后的结果给 long l 。至 ...

感谢版主,7楼的解答,作为初学者,我听得更明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-28 16:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表