除以零后剩余

时间:2014-03-08 22:07:49

标签: c++ c integer-division

我知道在数学中不允许除零,但我可以使用0的模数,我应该得到什么答案?

例如

10%0 = ?
5%0 = ?

4 个答案:

答案 0 :(得分:9)

标准将其定义为“未定义”。

在几乎所有处理器中,模数由与除法相同的功能执行。在现代较大的处理器中,它是一条指令(例如x86)。大多数情况下,此指令在除以零时会产生陷阱,这适用于代码是“打算使用模”还是“商”部分。

它是未定义的,因此处理器和编译器可以自由地实现他们想要的东西 - 例如如果处理器只返回输入的内容,那也是允许的,或者如果它导致整个操作系统崩溃,那么标准也是“很好”。

总之,零的模数与除以零一样糟糕。

(注意,通常情况下,浮点除以零不会捕获[默认],并产生无穷大值,除非值除以零,在这种情况下你得到“不是数字”)

答案 1 :(得分:7)

在C / C ++中它是Undefined behaviour,您可以根据编译器甚至同一程序的不同实例获得各种结果。

C11dr §6.5.5

  

二进制/运算符产生商和二进制%运算符   从第一个表达式的除法得到余数   第二。如果/或%的第二个操作数为零,则行为为   未定义

答案 2 :(得分:4)

结果是UB

C11dr§6.5.5“/运算符的结果是第一个操作数除以第二个操作数的商;%运算符的结果是余数。在两个运算中,如果是第二个操作数的值为零,行为未定义。“

答案 3 :(得分:1)

从数学上讲,你应该得到无限的,这是正确的答案......以编程方式,任何理智的编译器都会警告你除以零,因为模内运算符(至少在C / C ++中)被转换为一个除法(在大多数情况下)实现)。所以你的问题的答案是在两种情况下都会得到一个浮点异常。