马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 小蒙 于 2017-10-7 11:00 编辑
题目来自C primer plus 6th第六章复习题的13题。
答案如下: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
int * int 的结果是 int
所以溢出
int * long 结果是 long
所以没溢出
i*i 的类型 只和两个操作数的类型有关系
和你的函数返回值类型没关系
你返回值类型是long
只是把计算结果 转换成 long 而已
相当于return (long)(i*i);
i*i 溢出到了 1
相当于
return (long)1;
还是 1
|