私は何年もプロとして JavaScript を行ってきたので、C++ を学んでいます。signed
との違いは知っていますが、なぜそれらが存在するのかunsigned
理解できません。演出用か何か?
5 に答える
それらが必要だからです。
signed
型が存在するのは、負の数を使用したい場合があるためです。
unsigned
型が存在するのは、ビットごとの論理やシフトなどの一部の操作では、それらを使用する方がクリーンだからです (たとえば、符号ビットがどのように表現されるかを気にする必要がないなど)。
符号なしの値を使用すると、同等の符号付きの型よりも大きな正の範囲を取得できると主張できますが、主な理由は、負の数がほとんどまたはまったく意味をなさないドメインでマッピングの概念を許可することです。たとえば、コンテナーのサイズが負になることはありません。型で明示的になる符号なし型を使用する。
もう一度言いますが、この 2 つの存在と暗黙の変換は、まったく異なる一連の問題を引き起こします...
明らかに負になることのない長さを記述する必要がある低レベルの状況で役立ちます。たとえば、ファイルサイズ。
それらが存在するのは、処理する数学が異なる可能性があるためです。
2 つの 32 ビット値を乗算して 64 ビット値を取得することを検討してください。オペランドの符号に応じて、符号付き乗算と符号なし乗算で上位 32 ビットが異なる場合があります。アセンブリに取り掛かると、これが x86 に IMUL および MUL 命令がある理由です。
C は高水準言語として設計されていますが、_ASM キーワードを使用してアセンブリ言語コードをソース コードに直接挿入するなど、低水準の作業も簡単に実行できます。アセンブリ言語は CPU レジスタを直接処理し、算術命令は符号付き整数と符号なし整数の両方を処理します。変数の型はおそらく、まったく変換せずに CPU レジスタと変数の間で値を転送できるように設計されています。C から拡張された C++ もこの機能を継承しています。結局のところ、C/C++ が発明された当時、ほとんどのプログラマーはハードウェア エンジニアでもありました。