C奇怪的模运算

时间:2013-08-30 15:22:52

标签: c modulus

所以我得到了以下操作:

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

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

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

Google says它是9。

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

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

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

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

修改

featuredArticlesCounter是一个signed int

self.featuredArticles.count是一个unsigned int

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

  1. -1 == 0xFFFFFFFF(两个赞美编码)

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

  3. 4294967295 % 10 == 5(观察最后一位数无关紧要)

  4. 这是我最好的猜测。