4

だから私は次の操作を得たこのことを持っています:

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

この場合、self.featuredArticlesCounter は -1 で、
self.featuredArticles.count は 10 です。

つまり、基本的には -1 % 10 で、9 になるはずですが、結果は 5 になります。

Google は9 だと言っています。

そして、私がNSInteger articleIndex = -1 % 10;それを行うと、-1が得られます

NSUInteger を count から NSInteger にキャストしようとしましたが、うまくいきません。あちこちにブラケットを挿入しようとしましたが、それもうまくいきませんでした。

それ以来、使用に切り替えました((-1 % 10) + 10) % 10

しかし、私はまだここでの取引が何であるか疑問に思っています。何か案は?

編集

featuringArticlesCounter は符号付き int です

self.featuredArticles.count は unsigned int です

4

2 に答える 2

6

featuredArticlesCounter明らかに unsigned int です。-1 に設定したと思ったら、実際には2**32 - 1(~0) に設定しています。その数 mod 10 は 5です。(明らかに2**(8k)-1 % 105 であるため、実際の unsigned のサイズは関係ありません)

が である理由について-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 の補数エンコーディング)

  2. 0xFFFFFFFF == 4294967295(生データが符号なし整数であると仮定)

  3. 4294967295 % 10 == 5(最後の桁を観察すれば自明)

これが私の最善の推測です。

于 2013-08-30T15:41:57.290 に答える