我试图修改一个整数来获得一个数组位置,以便它循环.i %
arrayLength对于正数而言做得很好,但对于负数而言,这一切都是错误的.
4 % 3 == 1
3 % 3 == 0
2 % 3 == 2
1 % 3 == 1
0 % 3 == 0
-1 % 3 == -1
-2 % 3 == -2
-3 % 3 == 0
-4 % 3 == -1
Run Code Online (Sandbox Code Playgroud)
所以我需要一个实现
int GetArrayIndex(int i, int arrayLength)
Run Code Online (Sandbox Code Playgroud)
这样的
GetArrayIndex( 4, 3) == 1
GetArrayIndex( 3, 3) == 0
GetArrayIndex( 2, 3) == 2
GetArrayIndex( 1, 3) == 1
GetArrayIndex( 0, 3) …Run Code Online (Sandbox Code Playgroud) 似乎每当我将负int除以正int时,我需要它向下舍入(朝向-inf),而不是朝向0.但是C#和C++都向0舍入.
所以我想我需要一个DivideDownward()方法.我可以用几行来写一个负面的测试,依此类推,但我的想法看起来很糟糕.所以我想知道我是否遗漏了一些东西,如果你有一种"优雅"的方式将负分区向下舍入.
我注意到Python和Java中模数运算符的不同实现.
例如,在Python中:
>>> print -300 % 800
>>> 500
Run Code Online (Sandbox Code Playgroud)
在Java中:
System.out.println(-300 % 800);
-300
Run Code Online (Sandbox Code Playgroud)
这让我措手不及,因为我认为像模数一样基本的东西被普遍解释为同样的方式.我喜欢Python的解释(我认为它是从C借用的),尽管我看到了Java实现背后的逻辑.
你通常更喜欢哪一个?有不同解释的具体原因吗?我无意开始语言大战,只是好奇.
可能重复:
C++运算符%保证
在c ++ 98/03中
5.6-4
二元/运算符产生商,二元%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义; 否则(a/b)*b + a%b等于a.如果两个操作数都是非负的,那么余数是非负的; 如果没有,余数的符号是实现定义的.
在c ++ 11中:
5.6 -4
二元/运算符产生商,二元%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义.对于积分操作数,/运算符产生代数商,丢弃任何小数部分;如果商a/b在结果类型中可表示,则为(a/b)*b + a%b等于a.
正如您所看到的那样,为符号位定义的实现缺失了,它会发生什么?