web-dev-qa-db-ja.com

Cの算術アンダーフローとオーバーフローとは何ですか?

Cプログラミングで算術アンダーフローとオーバーフローは何を意味しますか?

21
Registered User

オーバーフロー

から http://en.wikipedia.org/wiki/Arithmetic_overflow

特定のレジスターまたはストレージ・ロケーションが保管または表現できる結果よりも計算の結果が大きい場合に発生する条件。

したがって、たとえば:

uint32_t x = 1UL << 31;
x *= 2;  // Overflow!

以下のコメントで@Rが言及しているように、C標準では次のことを提案しています。

結果の符号なし整数型で表すことができない結果は、結果の型で表すことができる最大値よりも1大きい数を法として減じられるため、符号なしオペランドを含む計算がオーバーフローすることはありません。

もちろん、これは「オーバーフロー」のかなり特異な定義です。ほとんどの人は、モジュロリダクション(つまり、ラップアラウンド)を「オーバーフロー」と呼びます。

アンダーフロー

から http://en.wikipedia.org/wiki/Arithmetic_underflow

浮動小数点演算の真の結果の大きさがターゲットデータ型の通常の浮動小数点数として表現可能な最小値よりも小さい(つまり、ゼロに近い)場合に発生するコンピュータープログラムの条件。

したがって、たとえば:

float x = 1e-30;
x /= 1e20; // Underflow!
31

コンピューターは0と1のみを使用してデータを表現するため、表現できる値の範囲が制限されます。多くのコンピューターは32ビットを使用して整数を格納するため、この場合に格納できる最大の符号なし整数は2 ^ 32 -1 = 4294967295です。ただし、最初のビットは符号を表すために使用されるため、実際には最大値は2 ^ 31-1 = 2147483647。

許容範囲外の整数が格納できるよりも多くのビットを必要とする状況は、オーバーフローと呼ばれます。

同様に、実数では、小さすぎて格納できない指数がアンダーフローを引き起こします。

8
AlexandraC