4

所以我得到了这个东西,我得到了以下操作:

NSInteger articleIndex = self.featuredArticlesCounter % self.featuredArticles.count;

在这种情况下 self.featuredArticlesCounter 是 -1 而
self.featuredArticles.count 是 10

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

谷歌说是 9。

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

我尝试将 NSUInteger 从 count 转换为 NSInteger ,但这不起作用。我试过在整个地方插入括号,但这也不起作用。

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

但我仍然想知道这里的交易是什么。有任何想法吗?

编辑

featuresArticlesCounter 是一个有符号整数

self.featuredArticles.count 是一个无符号整数

4

2 回答 2

6

featuredArticlesCounter显然是一个无符号整数。当您认为将其设置为 -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.

于 2013-08-30T15:41:50.400 回答
3

也许硬件(或软件?)将数字视为无符号整数:

  1. -1 == 0xFFFFFFFF(在二进制补码编码中)

  2. 0xFFFFFFFF == 4294967295(假设原始数据是一个无符号整数)

  3. 4294967295 % 10 == 5(通过观察最后一位数字很简单)

这将是我最好的猜测。

于 2013-08-30T15:41:57.290 回答