数据类型赋值机制与运算类型转换规则咨询
整数与浮点数除法的类型问题解答
先看示例代码:
double d0 = 4 / 3; double d1 = 4.0 / 3; double d2 = 4 / 3.0;
执行后结果为:d0=1、d1=1.33333、d2=1.33333
针对你的三个疑问,逐一解释:
1. 为何double类型的d0结果是整数1而非小数?
4和3都是int类型的整数,在C/C++这类语言里,整数之间做除法运算时,会直接执行整数除法——即舍弃计算结果的小数部分,只保留整数商,所以4/3的结果是int类型的1。
之后这个1才会被转换成double类型赋值给d0,但本质上已经是整数转浮点,结果就是1.0,显示时通常简化为1。
关键是:除法运算的类型由参与运算的操作数决定,和最终赋值的变量类型无关。
2. 为何d1、d2仅需一个操作数为浮点数即可得到小数结果?
当算术运算的两个操作数类型不同时,编译器会触发隐式类型转换:把精度较低的类型转换成精度较高的类型,再进行同类型运算。
比如4.0/3中,4.0是double类型,3是int类型,编译器会先把3转换成double类型的3.0,再执行浮点数除法,结果就是带小数的1.33333...;4/3.0的逻辑完全一致,只是把4转成4.0再运算。
不需要两个操作数都写成浮点数,因为转换后已经是同类型的浮点运算了。
3. 此类类型转换的判定规则是什么?
这类转换属于寻常算术转换,核心规则如下:
- 如果其中一个操作数是浮点类型(double优先级高于float),另一个整数类型会被转换成对应的浮点类型;
- 如果两个都是整数类型,会把宽度较小/精度较低的类型转换成宽度较大/精度较高的类型(比如int转long,short转int);
- 最终两个操作数会统一成同一种类型,再执行运算,目的是尽可能保留计算精度,避免不必要的精度损失。
内容的提问来源于stack exchange,提问作者essy.lin
相关产品推荐
相关产品推荐

