オーバーフロー。 Error 403 (Forbidden)|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

バッファオーバーフロー(バッファオーバーラン)とは

オーバーフロー

はじめに オーバーフロー、アンダーフローは意味が曖昧なまま使われているので、 一般的にどのような定義になっているのかまとめて見ました。 注意: 「うちは社内方言でこうだ」と言うのを否定するものではありません。 種類 一般的な定義の有無は対象が整数なのか浮動小数点数なのか、 はたまたバッファなのかによって異なるようです。 いかに示す通り、整数のアンダーフローのみ一般的な定義はありません。 オーバーフロー アンダーフロー 整数 YES NO 浮動小数点数 YES YES バッファ YES YES 整数 オーバーフロー そのビット幅で表現できる範囲の最大値を上回った場合、下限を下回った場合がオーバーフローです。 Wikipedia : 8bitの符号なし整数に入る値の範囲は0~255ですが、これを超えた場合が以下の例です。 b:0 b:255 アンダーフロー 整数の場合、一般的な定義は特に無いようです。 浮動小数点数 MSDNの記事が良い感じにまとまっています。 オーバーフロー 整数型と同じように、浮動小数点数型にも表現できる最大数があります。 詳しくは上記のMSDNのページをご覧ください。 アンダーフロー こちらは整数型にはない要素です。 値が限りなく0に近づいて表現しきれなくなると、浮動小数点数で表現しきれなくなります。 Wikipedia : しかし、用途によっては単に0と扱ってしまえば良かったりもします。 バッファ オーバーフロー Wikipedia : 確保している領域からはみ出してアクセスしてしまう事です。 PCなどのリッチな環境だとMMUで止めてくれたりしますが、 組み込み系の場合、特にスタックオーバーフローすると被害が甚大です。 ありがちな例:.

次の

Error 403 (Forbidden)|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

オーバーフロー

インテル8080にオーバーフローフラグが無い 2017年6月、35年ぶりにインテル8080マイクロプロセッサのアセンブラを書いています。 信号処理などでは、サチュレート 飽和 演算を使うことがあります。 サチュレート演算とは、演算結果が上限を超えたら上限値に、下限を超えたら下限値にするものです。 すなわち、オーバーフローを検出して演算結果を補正するわけです。 信号処理を得意とするDSP Digital Signal Processor では、命令セットにサチュレート演算があります。 また、マルチメディア対応のSIMD Single Instruction Multiple Data 命令にも、サチュレート演算命令があります。 しかし、1974年に登場したインテル8080マイクロプロセッサには、残念ながらサチュレート演算命令は存在しません。 その上、オーバーフローを検出するオーバーフローフラグもありませんでした。 そこで、ソフトウェアでオーバーフロー検出するアルゴリズムを整理しました。 数値の表現方法 コンピュータ内部は、数値を2進数で格納しています。 説明を簡単にするために、ここでは4ビットで説明します。 4ビットの場合、16種類の0と1の組み合わせがあります。 符号なし整数 : 0~15を表します• 符号つき整数 : 0~7、-1~-8を表します 4ビット 2進10進数対応表 符号つき整数の場合、マイナスの値は「2の補数表現」を使います。 「2の補数表現」では、最上位ビット MSB : Most Significant Bit が「1」のときマイナス数値を表します。 たとえば、• 2進数の加算 サチュレート 飽和 演算とは サチュレート演算とは演算結果がオーバーフローしたら上限値または下限値に補正する演算です。 オーバーフローとは、2の補数で表現可能な範囲に収まらないことを言います。 4ビットで説明します。 2の補数で表現可能な数値は、最大値は+7で最小値は-8です。 最大値 +7 を上回ったら、上限値 +7 に補正• 2の補数表現 4ビット符号つき整数 2の補数表現 のビットパターンと10進数数値を下記のように円形で示します。 4ビット2進数の加算とオーバーフロー 正の数+正の数 2+5は、中央の計算尺の +2 と数値 +5 を加算して 0111 となります。 しかし、2+6は正の最大値 0111 を上回りオーバーフローします。 正の数+負の数 2+ -8 は、中央の計算尺の +2 と数値 -8 を加算すると 1010 = -6 となります。 正の数 0~7 に負の数 -1~-8 を加算しても、オーバーフローすることはありません。 負の数+正の数 -2 +7は、中央の計算尺の -2 と数値 +7 を加算すると 0101 = +5 となります。 負の数 -1~-8 に正の数 0~7 を加算しても、オーバーフローすることはありません。 負の数+負の数 -2 + -6 は、中央の計算尺の -2 と数値 -6 を加算して 1000 となります。 しかし、 -2 + -7 は負の最大値 1000 を下回りオーバーフローします。 オーバーフロー検出 上記より「正の数+負の数」または「負の数+正の数」の場合、オーバーフローは発生しません。 すなわち、ふたつの数値の符号が異なればオーバーフローが発生しません。 D=B+C を求めるとします。 オーバーフローの検出 BとCの排他的論理和 B xor C のMSB=1ならば、異符号なのでオーバーフローは発生しません。 すなわち、CとDの排他的論理和 C xor D のMSB=1の場合にオーバーフローが発生します。 整理すると、次のようになります。 B xor C のMSB=0 かつ C xor D のMSB=1の場合、 オーバーフローが発生します。 i8080サチュレート加算コード インテル8080マイクロプロセッサでオーバーフローを検出してサチュレート加算するコード SADD8 を下記に示します。 レジスタBとレジスタCをサチュレート加算してレジスタAに結果を求めます。 テストケースを下記に示します。 DBは、正の数値しか定義できませんので、マイナスの数値は+256して定義します。 100は、数値B• 20は、数値C• 00hは、計算結果を格納する領域 実行結果の確認のため、BとCと期待値と加算結果を16進でダンプします。 」を表示します。 実行結果を下記に示します。 SADDの実行 テストコードを下記に示します。 8080にはオーバーフローフラグがありませんので、ソフトでオーバーフロー検出するアルゴリズムを整理しました。 オーバーフローが発生する状況を整理すると、そんなに複雑ではありませんでした。

次の

キャブレターのオーバーフローとは?原因と修理方法を解説

オーバーフロー

インテル8080にオーバーフローフラグが無い 2017年6月、35年ぶりにインテル8080マイクロプロセッサのアセンブラを書いています。 信号処理などでは、サチュレート 飽和 演算を使うことがあります。 サチュレート演算とは、演算結果が上限を超えたら上限値に、下限を超えたら下限値にするものです。 すなわち、オーバーフローを検出して演算結果を補正するわけです。 信号処理を得意とするDSP Digital Signal Processor では、命令セットにサチュレート演算があります。 また、マルチメディア対応のSIMD Single Instruction Multiple Data 命令にも、サチュレート演算命令があります。 しかし、1974年に登場したインテル8080マイクロプロセッサには、残念ながらサチュレート演算命令は存在しません。 その上、オーバーフローを検出するオーバーフローフラグもありませんでした。 そこで、ソフトウェアでオーバーフロー検出するアルゴリズムを整理しました。 数値の表現方法 コンピュータ内部は、数値を2進数で格納しています。 説明を簡単にするために、ここでは4ビットで説明します。 4ビットの場合、16種類の0と1の組み合わせがあります。 符号なし整数 : 0~15を表します• 符号つき整数 : 0~7、-1~-8を表します 4ビット 2進10進数対応表 符号つき整数の場合、マイナスの値は「2の補数表現」を使います。 「2の補数表現」では、最上位ビット MSB : Most Significant Bit が「1」のときマイナス数値を表します。 たとえば、• 2進数の加算 サチュレート 飽和 演算とは サチュレート演算とは演算結果がオーバーフローしたら上限値または下限値に補正する演算です。 オーバーフローとは、2の補数で表現可能な範囲に収まらないことを言います。 4ビットで説明します。 2の補数で表現可能な数値は、最大値は+7で最小値は-8です。 最大値 +7 を上回ったら、上限値 +7 に補正• 2の補数表現 4ビット符号つき整数 2の補数表現 のビットパターンと10進数数値を下記のように円形で示します。 4ビット2進数の加算とオーバーフロー 正の数+正の数 2+5は、中央の計算尺の +2 と数値 +5 を加算して 0111 となります。 しかし、2+6は正の最大値 0111 を上回りオーバーフローします。 正の数+負の数 2+ -8 は、中央の計算尺の +2 と数値 -8 を加算すると 1010 = -6 となります。 正の数 0~7 に負の数 -1~-8 を加算しても、オーバーフローすることはありません。 負の数+正の数 -2 +7は、中央の計算尺の -2 と数値 +7 を加算すると 0101 = +5 となります。 負の数 -1~-8 に正の数 0~7 を加算しても、オーバーフローすることはありません。 負の数+負の数 -2 + -6 は、中央の計算尺の -2 と数値 -6 を加算して 1000 となります。 しかし、 -2 + -7 は負の最大値 1000 を下回りオーバーフローします。 オーバーフロー検出 上記より「正の数+負の数」または「負の数+正の数」の場合、オーバーフローは発生しません。 すなわち、ふたつの数値の符号が異なればオーバーフローが発生しません。 D=B+C を求めるとします。 オーバーフローの検出 BとCの排他的論理和 B xor C のMSB=1ならば、異符号なのでオーバーフローは発生しません。 すなわち、CとDの排他的論理和 C xor D のMSB=1の場合にオーバーフローが発生します。 整理すると、次のようになります。 B xor C のMSB=0 かつ C xor D のMSB=1の場合、 オーバーフローが発生します。 i8080サチュレート加算コード インテル8080マイクロプロセッサでオーバーフローを検出してサチュレート加算するコード SADD8 を下記に示します。 レジスタBとレジスタCをサチュレート加算してレジスタAに結果を求めます。 テストケースを下記に示します。 DBは、正の数値しか定義できませんので、マイナスの数値は+256して定義します。 100は、数値B• 20は、数値C• 00hは、計算結果を格納する領域 実行結果の確認のため、BとCと期待値と加算結果を16進でダンプします。 」を表示します。 実行結果を下記に示します。 SADDの実行 テストコードを下記に示します。 8080にはオーバーフローフラグがありませんので、ソフトでオーバーフロー検出するアルゴリズムを整理しました。 オーバーフローが発生する状況を整理すると、そんなに複雑ではありませんでした。

次の