C++ における符号なし型と符号付き型の問題
给我你的怀抱
给我你的怀抱 2017-06-19 09:07:29
0
1
1532

質問 1:
「表現範囲を超える値を符号なし型に代入すると、結果は、符号なし型で表現される値の総数を除算した初期値の剰余になります。」この文はわかりますか?たとえば、8 ビット unsigned char に -1 を代入した結果が 255 になるのはなぜですか?
私の理解は次のとおりです: -1=11111111 (最初の 1 は負を表します) の場合、符号なしとして表現される場合、11111111=255
では、なぜ符号付き型にその表現範囲を超える値を割り当てるのでしょうか?結果の値は未定義ですか?
質問 2
算術式で符号付き型と符号なし型の両方が出現する場合、符号付き型の値が正の場合、符号なし型に変換した後の値は変換前と同じですか?例えば、int a=1, unsigned b=1 の場合、b を出力する場合、まず a が unsigned に変換されますが、変換後の a は 1 になりますか? int a=-1, unsingned b=2 の場合、b を出力する場合、まず a が unsigned 型に変換されますが、変換後の a の値は何になりますか? ###質問2: ###############
4 番目の長いコメントを図に示します。
この本で述べているのは、a b の結果が何であれ、a と b が符号なしで、もう一方が符号付きである限り、加算を実行する前に符号付きの方を符号なしに変換する必要があるということです。実際に図のプログラムを実行してみて思ったのですが、a b の結果が負の数で、a と b が符号付きと符号なしの場合のみ、結果が符号なしに変換されるのではないかと思いました。 どれが正しいですか?

给我你的怀抱
给我你的怀抱

全員に返信(1)
巴扎黑

質問1
実際、上記の説明は記憶の観点から見ると非常に単純であることがわかります。符号なしと符号付きの違いは、メモリの保存ではなく、メモリの取得です。たとえば、8 ビットを -1 に割り当てる例では、符号なしの場合、最後の 8 バイナリ ビットのみが埋められ、残りは破棄されます。この 8 ビットは符号なしなので、その中のすべての 2 進ビットは数値を表すため、255 になります。ただし、符号付き 8 ビットの場合、最初の 2 進数が符号ビットを表しますが、代入するとき、-1 の符号ビットは 8 ビット データの符号ビットにはならないため、8 ビットの符号ビットはデータは実際には無効であるため、この割り当てはエラーです。この文は、(-1)%256=255 を意味します。ここで 256 は、符号なし 8 ビットの合計数 (または範囲) です。
質問2
上記の通り、実は署名付きと署名なしの保存方法は同じですが、読み取り方法が異なります。符号付きのものは最初のビットを符号ビットとして扱い、符号なしのものは最初のビットを数値ビットとして扱います。メモリ内でも同様です。最初の a + b の結果は、バイナリ表現では 1 の束です。直接出力すると、符号なしに変換される、つまり符号なしを2つ加算するため、結果は符号なしとなり、1の束を符号なしとしてバイナリ出力すると4294967295となりますが、sumにa+bを代入するとsumとなります。値を格納します。メモリにはまだ 1 の束が残っていますが、sum は signed int であるため、読み取り時に最初のビットが符号ビットとみなされ、読み取り値は -1 になります。
質問2の場合、演算中に変換がないのではなく、値を格納する際にバイナリのみが考慮されており、符号の有無に違いはないということですね。符号ビットは読み出し時のみ判定されるため、出力結果が異なります。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート