长整型除以整型会遇到什么问题?

3

如何更安全地执行除法:

long long / int 还是 long long / (long long) int

在将 long long 除以 int 时,是否可能存在一些安全问题或逻辑问题?


这样的操作应该始终使用最大的类型来实现。但是我没有支持这一点的参考资料。 - marom
只要不除以零,就安全无虞。但是,如果分母大于分子,将得到一个 0 - Iharob Al Asimi
https://dev59.com/L2865IYBdhLWcg3wR8ah#3900417 - Sinstein
3
同符号整数的算术运算按预期工作。较小的类型(如果有)将被正确提升为较大的类型。 - The Paramagnetic Croissant
2
@iharob MinValue / -1 肯定不是安全的。 - Voo
2个回答

4
当使用int类型除以long long类型时,只要分母不为0,就不会出现安全问题或逻辑问题。
根据文档,许多期望算术或枚举类型操作数的二元运算符会引发转换并以类似的方式产生结果类型。目的是产生一个共同类型,这也是结果的类型。这种模式称为“通常算术转换”,其定义如下:
- 如果任一操作数的类型为long double,则另一个操作数应转换为long double。 - 否则,如果任一操作数是double,则另一个操作数应转换为double。 - 否则,如果任一操作数是float,则另一个操作数应转换为float。 - 否则,应对两个操作数执行整数提升。 - 然后,如果任一操作数为unsigned long,则另一个操作数应转换为unsigned long。 - 否则,如果一个操作数是long int,另一个操作数是unsigned int,则如果long int可以表示unsigned int的所有值,则将unsigned int转换为long int;否则,应将两个操作数都转换为unsigned long int。 - 否则,如果任一操作数是long,则另一个操作数应转换为long。 - 否则,如果任一操作数是unsigned,则另一个操作数应转换为unsigned。
[注意:否则,唯一剩余的情况是两个操作数都是int]
int / int => returns int

float / float => returns float

double /double => returns double

int / double => returns double

int / float => returns float

2
long.MinValue(就好像我记得宏一样)/-1 = ? :-) - Voo
LLONG_MIN / -1会导致浮点异常。然而,LLONG_MIN / (long long) (-1)也会产生同样的浮点异常。为什么会这样? - xennygrimmato
3
由于溢出的发生,(有符号)整数溢出会导致未定义的行为。 - R.. GitHub STOP HELPING ICE

0

正如已经提到的,从低精度到高精度(例如从float到double再到long double),没有转换问题——列表中的每个更高精度类型都可以容纳所有较低精度类型的值,因此转换不会丢失信息。

对于整数提升(例如long int和int)

如果任一操作数是long int,则另一个操作数将被转换为long int,并且这就是结果的类型。

因此,这是安全的(当然除以零除外)。有关更多详细信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接