C奇怪的模运算

And*_*rew 4 c modulus

所以我得到了以下操作:

NSInteger articleIndex = self.featuredArticlesCounter % self.featuredArticles.count;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,self.featuredArticlesCounter为-1,
self.featuredArticles.count为10

所以它基本上是-1%10,应该是9,但结果是5.

谷歌称这是9.

如果我这样做NSInteger articleIndex = -1 % 10;会给我-1

我已经尝试将NSUInteger从count转换为NSInteger,但这不起作用.我试过在所有地方插入括号,但这也不起作用.

我已经切换到使用了((-1 % 10) + 10) % 10.

但我仍然想知道这笔交易是什么.有任何想法吗?

编辑:

featuredArticlesCounter是一个签名的int

self.featuredArticles.count是一个unsigned int

Kev*_*vin 6

featuredArticlesCounter显然是一个unsigned int.当您认为将其设置为-1时,您确实将其设置为2**32 - 1(~0).那个数字mod 10是5.(显然,2**(8k)-1 % 10是5,所以它实际上是无符号的大小并不重要)

至于为什么-1 % 10-1的,我相信用C负数的MOD是实现定义的,但在这种情况下(在Java中),它定义成x / y + x % y == x.如果你插入负数,-1 / 10 + -1 % 10 = -1 -> -1 % 10 = -1.

  • 对于2的所有幂都不是这样.`(2 ^ 33 - 1)%10`是1.对于2 ^ n,如果n是4> 0的倍数,则为真,这使得它等于`(16 ^ (n/4) - 1)%10`.16的幂的最后一位数总是6,所以在减去1之后,最后一位数是5. (2认同)
  • @ugohoavgfhw:评论说"所有长度的无符号",它适用于所有整数类型都是8位字节的倍数的现代系统,答案是"2**(8k)",所以它也是仅适用于八个中的八个中的多个幂. (2认同)