[英]Remainder after division by zero
我知道数学中不允许用零除,但是我可以用零取模,应该得到什么答案?
例如
10%0 = ?
5%0 = ?
该标准将其定义为“未定义”。
在几乎所有处理器中,模都是由与除法相同的功能执行的。 在现代的大型处理器中,它是一条指令(例如x86)。 通常,该指令在被零除时将导致陷阱,并且无论代码是“打算使用模”部分还是“商”部分,这都适用。
它是未定义的,因此处理器和编译器可以自由地实现自己喜欢的功能-例如,如果处理器只是返回输入中输入的任何内容,这也是允许的,或者如果它导致整个OS崩溃,那也“很好”。标准。
总而言之,零模与除以零一样不好。
(请注意,通常,除以零的浮点数不会捕获(默认情况下),并且会生成无穷大的值,除非除以零的值也为零,在这种情况下,您会得到“非数字”)
在C / C ++中,它是Undefined behavior ,您可以根据编译器甚至同一程序的不同实例获得各种结果。
二进制/运算符产生商,二进制%运算符产生第一个表达式除以第二个表达式的余数。 如果/或%的第二个操作数为零,则行为不确定
结果是UB
C11dr§6.5.5“ /运算符的结果是第一个操作数除以第二个的商;%运算符的结果是余数。在两个运算中,如果第二个操作数的值为零,行为是不确定的。”
从数学上讲,您应该得到无限,这是正确的答案...以编程方式,任何明智的编译器都会警告您除以零,因为在内部将模运算符(至少在C / C ++中)转换为除法运算符(在大多数实现中)。 因此,问题的答案是,在两种情况下,您都将得到一个浮点异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.