[英]How to code a modulo (%) operator in C/C++/Obj-C that handles negative numbers
[英]Can I rely on % (modulo) operator in C for negative numbers?
使用GCC:
printf("%i \n", -1 % (int)4);
printf("%u \n", -1 % (unsigned int)4);
輸出:
-1
3
我可以跨平台依賴這種行為嗎? 我是否應該明確定義MOD
和REM
宏,以確保這不會改變?
從C99開始, 必須將 %
的結果四舍五入為Chris Dodd引用的0 。
此前C99標准, %
運營商對負數的行為是實現定義 。
當整數相除並且除法不精確時,如果兩個操作數都為正,則
/
運算符的結果為小於代數商的最大整數,並且%
運算符的結果為正。 如果操作數是負的 ,該結果是否/
操作者比代數商或最小整數比代數商更大的更少的最大整數是實現定義的 ,由於是的結果的符號%
運算符。 如果商a/b
是可表示的,則表達式(a/b)*b + a%b
等於a
。
因此,如果您以C99或更高版本為目標,則結果為“是” ,否則您將不能依靠它。
如果您需要一致的結果以及可移植到更舊的C標准的結果,則可以使用div
或ldiv
,而無需定義自己的MOD
和REM
有關div
, ldiv
和lldiv
函數的C99基本原理 :
因為當涉及負操作數時,C89具有實現定義的有義整數除法的語義,因此發明了C99中的div和ldiv和lldiv來為簽名的整數除法和余數運算提供明確規定的語義。
C99標准說:
6.5.5乘法運算符
:
當整數被除時, /運算符的結果是代數商,其中任何小數部分都被舍棄了87) 。 如果商a / b是可表示的,則表達式
(a / b)* b + a%b等於a 。
:
87)這通常被稱為``向零截斷''
這意味着除法總是四舍五入,因此您可以依靠它。
請注意,這與C ++ 03標准不同。
您的第二行進行無符號除法,將除法之前的值-1
轉換為unsigned int
。 這將始終小於2的冪,因此也有明確的定義。
多年來,模運算符( %
)已成為C和C ++標准的一部分。 我不確定您是否可以在C ++中重載它。 是的,您可以依靠它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.