-1

いくつかの値を出力したいとします。TMin符号付き変数がand TMax(この場合は 4 バイトの int、0x7FFFFFFFasTmaxおよび0x80000000asを使用)を超えた場合、整数オーバーフローが発生するはずですTminが、これらの例では期待どおりの結果が得られません (コメントで説明されています)。

// Tmax = 0x7FFFFFFF == 2147483647 
// Tmin = 0x80000000 == -2147483648 
printf("1- overflow test: %d\n", 0x7FFFFFFF+1 ); // overflow - how compiler finds out it's a signed value, not an Unsigned one
printf("2- overflow test: %d\n", 0x80000000-1 ); // in contrast, why I am not getting an integer overflow here
printf("3- overflow test: %d\n", (int) 0x80000000-1 ); // overflow (Expected)
printf("4- overflow test: %d\n",(int) (0x7FFFFFFF+1)); // overflow (Expected)
4

4 に答える 4

2

まず、(符号付き) 整数オーバーフローは未定義の動作を引き起こします

そのシナリオでは、何でも起こり得ます。UB を持つコードの出力を信頼することも、正当化することもできません。

明確にするために、

printf("2- overflow test: %d\n", 0x80000000-1 );

UBです。それ自体はオーバーフローで0x80000000-1はありませんが、使用すると型の不一致が発生し、技術的には UB につながります。unsigned%d

未定義の動作に関してはC11、附属書§J.2から、

整数型への変換または整数型からの変換により、表現できる範囲外の値が生成されます。

于 2016-02-01T20:01:11.103 に答える
1

OP で常に符号付き整数のオーバーフローが発生しているわけではありません。これは未定義の動作です。

以下は0x80000000、符号なし整数である可能性が高いため、符号なし数学です。16 進定数は、最初に適合する型です。int, unsigned, long, unsigned long, ...

printf("2- overflow test: %d\n", 0x80000000-1 );

0x80000000-1の値を持つ可能性が高い符号なしの型に0x80000000最初に適合するため、 は符号なしの型です。 --> .unsigned2147483648u2147483648u - 12147483647u

0x7FFFFFFF+1の値を持つ可能性が高い符号付きの型に0x7FFFFFFF最初に適合するため、符号付きの型です。+ -->および--> オーバーフロー。intINT_MAX
intintint INT_MAX + 1


OPは、「Tminとして0x80000000」は確かに誤解です。C では、32 ビットint/unsigned0x80000000は、値が の 16 進定数です2147483648。OP の場合、Tmin の可能性が高くなり-INT_MAX - 1ます。

于 2016-02-01T20:12:25.343 に答える