【发布时间】:2021-05-11 16:29:49
【问题描述】:
我研究过,当执行除法时,如果有 2 种数据类型,比如有一个浮点值除以一个 int 值,那么它将转换为更高的精度,即浮点数。
算术运算总是这样,编译器会进行隐式类型转换,还是我们必须在某处显式执行这种类型转换,否则会出错。
【问题讨论】:
标签: c casting type-conversion
我研究过,当执行除法时,如果有 2 种数据类型,比如有一个浮点值除以一个 int 值,那么它将转换为更高的精度,即浮点数。
算术运算总是这样,编译器会进行隐式类型转换,还是我们必须在某处显式执行这种类型转换,否则会出错。
【问题讨论】:
标签: c casting type-conversion
一般来说,执行算术运算时不需要转换操作数。 C 有许多自动转换操作数的规则,它们适用于许多情况。
在许多当前的 C 实现中,float 并不比int 更精确。 int 通常是 32 位,float 有 24 位用于有效数(浮点数的小数部分),大约 8 位用于指数,1 位用于符号。这使float 范围更广,但精度更低。转换规则给出了用于转换的类型的排名,但并不是严格地从不太精确到更精确。
自动转换并非适用于所有情况,C 程序员需要熟悉规则以便知道何时添加强制转换。其中包括:
1的一个例子是当我们想将两个整数相除并得到一个浮点结果:
float x = 1/3; // Wrong, integer division is performed, yielding zero, but we want (approximately) ⅓.
float x = (float) 1 / 3; // Right, convert at least one operand to float (or use 1.f, a float constant).
另一个例子是两个整数可能溢出:
int x = Some large integer;
int y = Some large integer;
long z = x*y; // Wrong, result may overflow.
long z = (long) x * y; // Possibly right, long may be wide enough to represent product.
2 的一个例子是从int 到float 的转换可能会丢失精度:
float x = 2;
int y = 123456789;
double z = x*y; // Wrong, converting 123456789 to float loses precision and produces 123456792 in many C implementations.
double z = x * (double) y; // Right, double has enough precision in many C implementations.
【讨论】:
int z = (long) x * y 可能是对的,但即使右值为long,它不会在z 中溢出吗?另外,在分配之前检查,最佳实践是什么?我的猜测是您可能希望将LONG_MAX 除以x 并检查y 是否小于结果。然而,分裂是缓慢的。一定有更好的方法吗?