C仕様で、符号なし変数(特にunsigned shortint
)が整数オーバーフローでいわゆるラップアラウンドを実行することを少し読んだ.
私の教授は、それらの値もラップアラウンドされると私に言いました (おそらく彼は単に gcc を意味していたのでしょう)。ビットが切り捨てられ、残ったビットが奇妙な値を与えると思いました!
ラップアラウンドとは何か、ビットの切り捨てとどう違うのか。
C仕様で、符号なし変数(特にunsigned shortint
)が整数オーバーフローでいわゆるラップアラウンドを実行することを少し読んだ.
私の教授は、それらの値もラップアラウンドされると私に言いました (おそらく彼は単に gcc を意味していたのでしょう)。ビットが切り捨てられ、残ったビットが奇妙な値を与えると思いました!
ラップアラウンドとは何か、ビットの切り捨てとどう違うのか。
未定義の動作は、符号付き整数型を符号と大きさ、1 の補数、または 2 の補数として表すことができる初期の移植性の問題に起因します。
現在、すべてのアーキテクチャは整数を 2 の補数で表しており、ラップアラウンドしています。ただし、注意してください。コンパイラは、未定義の動作を実行しないと想定するのが正しいため、最適化がオンになっていると奇妙なバグに遭遇する可能性があります。
符号付き 8 ビット整数では、ラップ アラウンドの直感的な定義は、+127 から -128 に移動するように見えるかもしれません -- 2 の補数バイナリ: 0111111 (127) と 1000000 (-128)。ご覧のとおり、これはバイナリ データをインクリメントする自然な進行です。これは、符号付きまたは符号なしの整数を表すとは見なされません。直観に反して、実際のオーバーフローは、符号なし整数のラップアラウンドの意味で -1 (11111111) から 0 (00000000) に移動するときに発生します。
これは、標準に従った「正しい」動作がないため、符号付き整数がオーバーフローしたときの正しい動作は何かというより深い質問には答えません。