【问题标题】:Is type casting always necessary for all arithmetic operations?所有算术运算都需要类型转换吗?
【发布时间】:2021-05-11 16:29:49
【问题描述】:

我研究过,当执行除法时,如果有 2 种数据类型,比如有一个浮点值除以一个 int 值,那么它将转换为更高的精度,即浮点数。

算术运算总是这样,编译器会进行隐式类型转换,还是我们必须在某处显式执行这种类型转换,否则会出错。

【问题讨论】:

标签: c casting type-conversion


【解决方案1】:

一般来说,执行算术运算时不需要转换操作数。 C 有许多自动转换操作数的规则,它们适用于许多情况。

在许多当前的 C 实现中,float 并不比int 更精确。 int 通常是 32 位,float 有 24 位用于有效数(浮点数的小数部分),大约 8 位用于指数,1 位用于符号。这使float 范围更广,但精度更低。转换规则给出了用于转换的类型的排名,但并不是严格地从不太精确到更精确。

自动转换并非适用于所有情况,C 程序员需要熟悉规则以便知道何时添加强制转换。其中包括:

  1. 当结果不可表示或无法以所需的精度表示时,默认类型。
  2. 当自动转换会导致其中一个操作数出错时。

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 的一个例子是从intfloat 的转换可能会丢失精度:

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 是否小于结果。然而,分裂是缓慢的。一定有更好的方法吗?
  • @torstenvl:谢谢,已修复。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多