带符号整数的除法与余数
复习C++Prime4th的时候,看见书上对/和%操作符有以下描述:
Forbothdivision(/)andmodulus(%),whenbothoperandsarepositive,theresultispositive(orzero).Ifbothoperands
arenegative,theresultofdivisionispositive(orzero)andtheresultofmodulusisnegative(orzero).Ifonlyone
operandisnegative,nisalsomachine-
dependentformodulus;thesignisnegative(orzero)fordivision:
21%6;//ok:resultis3
21%7;//ok:resultis0
-21%-8;//ok:resultis-5
21%-5;//machine-dependent:resultis1or-4
21/6;//ok:resultis3
21/7;//ok:resultis3
-21/-8;//ok:resultis2
21/-5;//machine-dependent:result-4or-5
这段隐晦难懂的⽂字结合代码转换成表格后依然让⼈难以理解:
aba/ba%b
>0>0>=0,取值可唯⼀确定>=0,取值可唯⼀确定
<0<0>=0,取值可唯⼀确定<=0,取值可唯⼀确定
>0<0<=0,取值由实现决定符号和取值均由实现决定
<0>0<=0,取值由实现决定符号和取值均由实现决定
于是我下载了C++Prime4th出版时C++最新版本(C++03)的ISO标准⽂档,在章节5.6Multiplicativeoperators下找到了如下叙
述:
Thebinary/operatoryieldsthequotient,andthebinary%operatoryieldstheremainderfromthedivisionofthefirst
econdoperandof/or%iszerothebehaviorisundefined;otherwi(a/b)*b+a%bis
operandsarenonnegativethentheremainderisnonnegative;ifnot,thesignoftheremainderis
implementation-defined.
也就是说对于整数除法和取余,C++03只确保以下两点:
(a/b)*b+a%b=a(b!=0)。
a%b>=0(a>=0&&b>0)。
在经典和标准的描述中,都指出了余数的符号,却没有提及更容易让⼈理解的取整⽅法。
为此,我根据数学意义上的公式“商×除数+余数=被除数”做出了不同取整⽅法下,a和b的符号与a%b的符号的对应图:
根据这些图表,从取整⽅法的⾓度,可以得出以下结论:
标准:在操作数均为正数时向下取整(此时也是向零取整),其余情况由实现决定。
经典:在操作数符号相同时向下取整(此时也是向零取整),异号情况由实现决定。
经典与标准对操作数均为负数时描述的不⼀致让我迷惑,莫⾮是作者的⼀时疏忽?然⽽当我在C++Prime5th中的相应章节找到以下叙述
时顿感纳闷:
Inadivision,anonzeroquorversions
ofthelanguagepermittedanegativequotienttoberoundedupordown;thenewstandardrequiresthequotienttobe
roundedtowardzero(i.e.,truncated).
“早期的语⾔标准允许负数商向上取整或向下取整”这⼀句岂不是暗⽰在操作数符号相同时取整⽅法是有明确规定的?
也许是n连错了两次?
另外,C++11中已经规定,整数除法⼀律采⽤向零取整:
Forintegraloperandsthe/operatoryieldsthealgebraicquotientwithanyfractionalpartdiscarded(Thisisoften
calledtruncationtowardszero.);
这⼀点在上述的C++Prime5th的叙述中也有提到。
本文发布于:2022-11-15 06:53:10,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/22726.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |