[問題] c/c++的整數除法和取餘數運算

看板C_and_CPP作者 (柊 四千)時間6年前 (2018/05/02 01:20), 6年前編輯推噓4(4014)
留言18則, 4人參與, 6年前最新討論串1/1
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://www.ptt.cc/bbs/C_and_CPP/M.1525195247.A.308.html

05/02 02:46, 6年前 , 1F
https://goo.gl/Ng8XwH 怎麼會沒答案
05/02 02:46, 1F
之前打英文關鍵字 也沒找到這篇orz 有看到其他人問 但回答都答非所問 例如叫大家小心c/c++的%不是數學上的餘數定義之類的

05/02 02:47, 6年前 , 2F
其實就是除法的商要 trunc() 還是 floor() 的差別
05/02 02:47, 2F

05/02 02:47, 6年前 , 3F
C/C++ (在 C99/C++11 之後) 取 trunc(), Python 取 floor()
05/02 02:47, 3F
我想知道的是為什麼要取trunc() 因為取trunc() 對程式語言的使用者來說 一點好處也沒有 就像我也可以引入一種新的取餘運算 定義除以某個正整數m的時候 餘數在m+7122到2m+7121之間 可是這種運算就是增加使用者的麻煩而已

05/02 02:48, 6年前 , 4F
stackoverflow 裡面主要的理由是處理器實作方便
05/02 02:48, 4F

05/02 02:48, 6年前 , 5F
你遇到負號,是用正除法再取負號比較方便,還是按照
05/02 02:48, 5F

05/02 02:49, 6年前 , 6F
數學上的定義再進位一次變成正數比較方便呢?
05/02 02:49, 6F

05/02 02:50, 6年前 , 7F
而且會取 trunc() 其實也是因為處理器實作多這樣做的關係
05/02 02:50, 7F

05/02 02:50, 6年前 , 8F
在 C99/C++11 之前 C/C++ 是不規定你要怎麼取的
05/02 02:50, 8F

05/02 02:51, 6年前 , 9F
就是處理器怎麼做我們就怎麼做的意思
05/02 02:51, 9F

05/02 02:53, 6年前 , 10F
話說回來我看起來 python 好像是反過來定, 先定餘數恆非負
05/02 02:53, 10F

05/02 02:54, 6年前 , 11F
然後據此定義整數除法; C/C++ 則是先定整數除法如何處理
05/02 02:54, 11F

05/02 02:54, 6年前 , 12F
再據此定義餘數, 所以方向上就會不一樣
05/02 02:54, 12F
所以結論是 為了加速/和%的計算速度 c/c++只好規定 一個負整數除以正整數m 對商取trunc()而讓餘數介於-m+1到0之間? 聽起來不是沒有道理 但是我好失望QAQ ※ 編輯: xavier13540 (140.112.229.87), 05/02/2018 07:52:45

05/02 14:58, 6年前 , 13F
不是規定吧 是隨便processor怎麼做
05/02 14:58, 13F

05/02 18:28, 6年前 , 14F
有什麼好失望的,如果連這麼簡單的語言特性都沒有辦
05/02 18:28, 14F

05/02 18:28, 6年前 , 15F
法掌握,不符合傳統數學的東西就覺得不合理,那可能
05/02 18:28, 15F

05/02 18:28, 6年前 , 16F
還是不要寫C比較好
05/02 18:28, 16F

05/02 23:27, 6年前 , 17F
我的關鍵字: why cpp division negative remainder
05/02 23:27, 17F

05/02 23:27, 6年前 , 18F
remainder 要打出來
05/02 23:27, 18F
文章代碼(AID): #1QwA7lC8 (C_and_CPP)