簡體   English   中英

我可以依靠C中的%(模)運算符獲取負數嗎?

[英]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

我可以跨平台依賴這種行為嗎? 我是否應該明確定義MODREM宏,以確保這不會改變?

從C99開始, 必須將 %的結果四舍五入為Chris Dodd引用的0

此前C99標准, %運營商對負數的行為是實現定義

當整數相除並且除法不精確時,如果兩個操作數都為正,則/運算符的結果為小於代數商的最大整數,並且%運算符的結果為正。 如果操作數是負的 ,該結果是否/操作者比代數商或最小整數比代數商更大的更少的最大整數是實現定義的 ,由於是的結果的符號%運算符。 如果商a/b是可表示的,則表達式(a/b)*b + a%b等於a

ANSI C或ISO C是否指定了-5 % 10

因此,如果您以C99或更高版本為目標,則結果為 ,否則您將不能依靠它。

如果您需要一致的結果以及可移植到更舊的C標准的結果,則可以使用divldiv ,而無需定義自己的MODREM

有關divldivlldiv函數的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM