私は学校で C を学び始めたばかりで、基本的な概念を把握しようとしています。
私たちの宿題には質問があります。
すべてのためのint x: x+1 > x
真か偽かを判断し、真なら理由を、偽なら反例を挙げてください。
int 型は 32 ビットであり、基本的には整数がバイナリ形式であることを意味すると教えられたので、私は混乱しています。x+1 は 10 進数の 1 に 1 を加えたものですか?
私は学校で C を学び始めたばかりで、基本的な概念を把握しようとしています。
私たちの宿題には質問があります。
すべてのためのint x: x+1 > x
真か偽かを判断し、真なら理由を、偽なら反例を挙げてください。
int 型は 32 ビットであり、基本的には整数がバイナリ形式であることを意味すると教えられたので、私は混乱しています。x+1 は 10 進数の 1 に 1 を加えたものですか?
x + 1 > x
は、 がオーバーフローであるため、の値の未定義の動作であるvalue を除く1
すべての値です。int
INT_MAX
INT_MAX + 1
x + 1 > x
x
INT_MAX
これは実際には、コンパイラが式を最適化する権利を持っていることを意味します。
x + 1 > x
に
1
INT_MAX + 1
未定義の動作であるため、コンパイラには、この特定の式が であると言う権利が>
ありINT_MAX + 1
ます> INT_MAX
。
式はのx + 1 > x
未定義の動作であるため、 false ( ) である可能性があるx == INT_MAX
と想定することも安全ではありません。x + 1 > x
0
if が anではなく anx
として宣言されていることに注意してください。状況はまったく異なります。オペランドがオーバーフローすることはありません (ラップアラウンドします)。したがって、他のすべての値が対象となります。unsigned int
int
unsigned int
UINT_MAX + 1 == 0
x + 1 > x
0
x == UINT_MAX
1
x
最近のコンパイラ ( などgcc
) は通常、この式を最適化して に置き換え1
ます。
記録として、次のようなコードを使用する既知のサーバー プログラムには、重大なセキュリティ上の問題がいくつかありました。
if (ptr + offset < ptr)
コードは安全条件をトリガーすることを意図していましたが、コンパイラーはif
(式を に置き換えることによって) ステートメントを最適化し0
、攻撃者がサーバープログラムで特権エスカレーションを取得することを可能にしました (覚えていれば、悪用可能なバッファーオーバーフローの可能性を開くことによって)。正しく)。
32 ビットの数値範囲については、[-2 31 , 2 31 -1 ] [-2147483648, 2147483647]
に等しいことに注意してください。
したがって、式x+1 > x
は真です[-2147483648, 2147483646]
しかし、32ビットサイズの数値に2147483647
追加するとビットオーバーフローが発生するため、多くの実装ではそうではありませんが、実際の動作はC標準では未定義です。 2147483647
x + 1
-2147483648
そう、
x + 1 > x
のみx
に 真[-2147483648, 2147483646]
x + 1 > x
、 for x = 2147483647
is Undefined 値は、コンパイラによって True または False の場合があります。コンパイラが計算する場合、=-2147483648
値は False になります。答えを教えたくないので、あなたが正しい方向に進むように質問をして返信します.
32 ビットの符号付き整数に格納できる最大値はx + 1
いつですか? x
(2,147,483,647)