NSUInteger の値が 2^32 ではなく 2^32 - 1 になるのはなぜですか? この事実と nan 値の必要性との間に関係はありますか? これはとても紛らわしいです。
5 に答える
指で10まで数えます。本当 :)
10 まで数える標準的な方法は1,2,3,..10
(各指の順序を数える) です。しかし、「指0本」はどうでしょうか。
通常、これは手を背中の後ろに置くことで表されますが、別の情報がシステムに追加されます: 手が前にある (存在する) か、後ろにある (欠落している) か?
この場合、手を後ろに置くことnil
は、NSNumber
変数に代入することと同じです。ただし、この余分な状態を持たないNSUInteger
ネイティブの整数型を表し、有用であるためには0 をエンコードする必要があります。
指で値 0 をエンコードするための鍵は、0,1,2..9
代わりに単純に数えることです。同じ数の指 (または情報のビット) を利用でき0
ますが、値を持たないことを犠牲にして、有用なものを説明できるようになりました10
(まだ 10 本の指がありますが、10 番目の指は値を表すだけです9
)。2^n-1
これは、符号なし整数の最大値が であり、 ではないのと同じ理由です。これにより、最大効率でエンコード2^n
できます。0
現在、NaN
は典型的な整数値ではなく、浮動小数点エンコーディングに由来します -float
またはを考えてCGFloat
ください。そのような一般的なエンコーディングの 1 つはIEEE 754です。
コンピューティングでは、数値ではないことを表す NaN は、特に浮動小数点計算で、未定義または表現不可能な値を表す数値データ型の値です。
これは、32 ビットの符号なし整数変数が保持できる最大値です。これに 1 を加えると、ゼロに戻ります。
その理由は、最小の符号なし数値が 1 ではなく 0 であるためです。考えてみてください。小数点以下 4 桁に収まる最大の数は 10000 ではなく 9999 です。これは 10^4-1 です。
ビットは0から数えるので2^32-1。2^32 - 2^0 と考えてください。
2^32 を 4 バイトに格納することはできませんが、1 を引くと収まります (結果は 0xffffffff)。
車の走行距離計が最大 999999 mi/km (6 桁と仮定) を示すのとまったく同じ理由です。10^6 の可能な値がありますが、10^6 自体を表示することはできず、0 から 10^6-1 までを表示できます。