作者xavier13540 (柊 四千)
看板C_and_CPP
标题[问题] c/c++的整数除法和取余数运算
时间Wed May 2 01:20:44 2018
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
--
小妹妹:「大哥哥~你说的魔法棒在哪里呀~??」
大哥哥:「在这里啊~!(掏出魔法棒)你看你看,牠会自己长大喔~」
小妹妹:「哇!!真的耶!用这个就可以长大吗~?怎麽用啊~?」
大哥哥:「来!手给我,对对,就是摆在那里,轻轻的上下移动...对对!就是这样!」
小妹妹:「这样吗@.@?上下移动?好好玩喔~哈哈~又变大了耶~」
大哥哥:「对对!喔..喔..对了!等等会有魔法药剂跑出来,要喝掉它才有效果喔~」
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.229.87
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1525195247.A.308.html
之前打英文关键字 也没找到这篇orz
有看到其他人问 但回答都答非所问 例如叫大家小心c/c++的%不是数学上的余数定义之类的
2F:推 LPH66: 其实就是除法的商要 trunc() 还是 floor() 的差别 05/02 02:47
3F:→ LPH66: C/C++ (在 C99/C++11 之後) 取 trunc(), Python 取 floor() 05/02 02:47
我想知道的是为什麽要取trunc()
因为取trunc() 对程式语言的使用者来说 一点好处也没有
就像我也可以引入一种新的取余运算
定义除以某个正整数m的时候 余数在m+7122到2m+7121之间
可是这种运算就是增加使用者的麻烦而已
4F:→ alan23273850: stackoverflow 里面主要的理由是处理器实作方便 05/02 02:48
5F:→ alan23273850: 你遇到负号,是用正除法再取负号比较方便,还是按照 05/02 02:48
6F:→ alan23273850: 数学上的定义再进位一次变成正数比较方便呢? 05/02 02:49
7F:推 LPH66: 而且会取 trunc() 其实也是因为处理器实作多这样做的关系 05/02 02:50
8F:→ LPH66: 在 C99/C++11 之前 C/C++ 是不规定你要怎麽取的 05/02 02:50
9F:→ LPH66: 就是处理器怎麽做我们就怎麽做的意思 05/02 02:51
10F:→ LPH66: 话说回来我看起来 python 好像是反过来定, 先定余数恒非负 05/02 02:53
11F:→ LPH66: 然後据此定义整数除法; C/C++ 则是先定整数除法如何处理 05/02 02:54
12F:→ LPH66: 再据此定义余数, 所以方向上就会不一样 05/02 02:54
所以结论是 为了加速/和%的计算速度
c/c++只好规定 一个负整数除以正整数m 对商取trunc()而让余数介於-m+1到0之间?
听起来不是没有道理 但是我好失望QAQ
※ 编辑: xavier13540 (140.112.229.87), 05/02/2018 07:52:45
13F:→ MOONRAKER: 不是规定吧 是随便processor怎麽做 05/02 14:58
14F:→ ThomasHuang: 有什麽好失望的,如果连这麽简单的语言特性都没有办 05/02 18:28
15F:→ ThomasHuang: 法掌握,不符合传统数学的东西就觉得不合理,那可能 05/02 18:28
16F:→ ThomasHuang: 还是不要写C比较好 05/02 18:28
17F:推 alan23273850: 我的关键字: why cpp division negative remainder 05/02 23:27
18F:→ alan23273850: remainder 要打出来 05/02 23:27