2012-04-04 3 views
3

こんにちは私はここに新しいですので何かが間違っていると私に知らせてください、私は次回より良くしようとします。C++のアンダーフローとオーバーフロー

私はアンダーフローとオーバーフローがC++でどのように動作するかを理解しようとしています。変数の範囲を超えると、範囲の反対側から開始します。 。ショートの最小値は-32768であり、我々がしなければ-1をそこに新しい値がSHRT_MAX(32767) するかどうこうしてここに私のコードです:

通常
#include<iostream.h> 
#include<limits.h> 
#include<conio.h> 
int main (void) 
{ 
int testpositive =INT_MIN ; 
short testnegative = SHRT_MIN ; 
cout<< SHRT_MIN<<"\n"; 
cout << testnegative-1<<"\n"; 
cout << INT_MIN << "\n"; 
cout << testpositive-1 << "\n"; 
cout<<testpositive-2; 
getch(); 
return 0; 
} 
+1

オペランドが最初に「int」に昇格されるので、オーバーフローはありません。あなたが望んでいるものを見るために、結果を短くキャストすることを検討してください。 –

+0

Amazing.Itは動作し、今私は理解する。 – Knownow

答えて

2

はい。しかし、これはC++であり、C++はC++標準によって規制されているため、オーバーフローがの未定義の動作であることを知る必要があります。

あなたが述べたことはおそらくほとんどのプラットフォームに当てはまりますが、それは決して保証されていないので、それに頼らないでください。

+0

* signed *オーバーフローは未定義の動作です – mabraham

1

新しい値はSHRT_MAXである必要はありません。未定義です。

+1

動作は未定義です。プログラムは非常にうまくクラッシュする可能性があります。 –

3

オーバーフロー/アンダーフローでの正確な動作は、unsignedタイプでのみ指定されています。通常の符号付き整数型の代わりに、C++標準では何かが起こる可能性があると単純に言います。

x86プロセッサ(または他のほとんどの最新のプロセッサ)について言えば、実際の動作は正確に記述したものであり、CPUの場合は符号付きの値と符号なしの値との間に違いはありません(オペレーションですが、値自体は単なるビットです)。

+3

現代のコンパイラは、署名されたオーバーフローを利用して、未定義の動作で最適化を実行します。つまり、CPUレベルで動作が定義されていても、プログラムが未定義の動作を呼び出さないという保証はありません。 – ouah

1

符号付きオーバーフローは、C++では未定義の動作です。例えば

INT_MIN - 1

-INT_MIN

は、未定義の振る舞いを呼び出す式です。整数プロモーションとオペランドが最初intに昇格されているため

SHRT_MIN - 1-SHRT_MIN 16ビットshortおよび32ビットintと環境における未定義の動作はありません。 16ビットのshortintの環境では、これらの式も未定義の動作です。

関連する問題