次のようなコード行を見ました。
xxxxx = (uint16_t) -1;
-1 を unsigned int にキャストするのはなぜですか? このコードは何を取得しますか?
ありがとう!
次のようなコード行を見ました。
xxxxx = (uint16_t) -1;
-1 を unsigned int にキャストするのはなぜですか? このコードは何を取得しますか?
ありがとう!
可能な最大の符号なし 16 ビット整数を返します。
もちろん、答えはあなたの指先の届くところにあります。そのコードをプラグインしてステップ実行するだけで、-1 を 16 ビットの符号なし整数にキャストしたときに得られる値が表示されます。
値は -1の 2 の補数であることがわかります。つまり、 0xFFFF hex、または 65535 decimalです。
そのようなコードを使用する実際の理由に関しては、それは単なる近道です。あるいは、型の互換性要件を満たすためだけかもしれません。
なぜ -1 が 0xFFFF (65535) にキャストされ、おそらく 0 または 1 にキャストされないのか疑問に思っている場合は、C 言語が静的に型付けされているとはいえ、かなりリベラルであることを理解する必要があります。型制限を強制する場合。つまり、任意のメモリ位置を、指定した任意のタイプのデータとして喜んでキャスト (または必要に応じて解釈) します。これはもちろん、不適切に使用すると非常に壊滅的な結果をもたらす可能性がありますが、厳密なサニティ チェックの欠如による柔軟性と速度の向上というトレードオフがあります。これは、C が設計された数十年前に非常に重要であり、非常に小さなプロセッサ用のコードを記述している場合でも重要です。
そうは言っても、キャストを単に次のように考えている場合は、「このメモリ位置のデータについて知っていると思うことは無視してください。それを として読んだ場合の意味を教えてください<insert_your_type_here>
」。負の数を 2 の補数で表す (上記を参照) 場合、答えはかなり明白なはずです。C はメモリ内の値を取得し、それを符号なし整数として読み戻します。
エンディングノートとして。-1 を 0xFFFF にキャストする言語は C だけではないことを指摘しておく必要がありますが、より強力な型チェックが可能な最新の言語でも、おそらく互換性と継続性の理由で同じことを行います。キャストを逆にすることができます。0xFFFF を符号付き 16 ビット整数に戻すと、-1 になります。
2 バイト (16 ビット) の符号なし整数の最大値である 65535 を返します。