[问题] c/c++的整数除法和取余数运算

楼主: xavier13540 (柊 四千)   2018-05-02 01:20:44
c和c++的/和% 并不是常见的除法定义
例如下面这两行
printf("5/3 = %d...%d\n", 5/3, 5%3);
printf("(-5)/3 = %d...%d\n", (-5)/3, (-5)%3);
会跑出
5/3 = 1...2
(-5)/3 = -1...-2
我实在是想不到在什么情况下 需要让我的余数是负的
// 反观python的//和% 定义就和数学上常用的定义一样
请问当初究竟为什么要把/和%定义成这样?
我试着google过了 没找到答案orz
作者: alan23273850   2018-05-02 02:46:00
https://goo.gl/Ng8XwH 怎么会没答案
作者: LPH66 (-6.2598534e+18f)   2018-05-02 02:47:00
其实就是除法的商要 trunc() 还是 floor() 的差别C/C++ (在 C99/C++11 之后) 取 trunc(), Python 取 floor()
作者: alan23273850   2018-05-02 02:48:00
stackoverflow 里面主要的理由是处理器实作方便你遇到负号,是用正除法再取负号比较方便,还是按照数学上的定义再进位一次变成正数比较方便呢?
作者: LPH66 (-6.2598534e+18f)   2018-05-02 02:50:00
而且会取 trunc() 其实也是因为处理器实作多这样做的关系在 C99/C++11 之前 C/C++ 是不规定你要怎么取的就是处理器怎么做我们就怎么做的意思话说回来我看起来 python 好像是反过来定, 先定余数恒非负然后据此定义整数除法; C/C++ 则是先定整数除法如何处理再据此定义余数, 所以方向上就会不一样
作者: MOONRAKER (㊣牛鹤鳗毛人)   2018-05-02 14:58:00
不是规定吧 是随便processor怎么做
作者: ThomasHuang (命贱如草)   2018-05-02 18:28:00
有什么好失望的,如果连这么简单的语言特性都没有办法掌握,不符合传统数学的东西就觉得不合理,那可能还是不要写C比较好
作者: alan23273850   2018-05-02 23:27:00
我的关键字: why cpp division negative remainderremainder 要打出来

Links booklink

Contact Us: admin [ a t ] ucptt.com