• ベストアンサー

オーバーフローについて教えてください。

複数のIT用語辞典で調べるとオーバーフローとはデータ型が扱える範囲の上限を超えてしまうこととありました。 とするとint型の場合 32,767を超えることはオーバーフローと言うのでしょうけど、–32,768を下回ることはなんと言うのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

IT用語も、常に同じ意味で使われるとは限りません。 上に溢れる「オーバーフロー」と、下に溢れる「アンダーフロー」です。 この上下の基準が変われば、値の変わります。 整数の場合 最大値から最小値までが「上下」と考えれば、最小値より小さくなってしまうのは「アンダーフロー」です。 精度で考えれば、負の最小値(絶対値が最大)より小さくなることは、取り得る値を越えてしまうので「オーバーフロー」です(特に「負のオーバーフロー」といったりします)。「アンダーフロー」は最小精度の1より小さくなってしまうことです。 検索でいくつかの「IT用語」を見てみましたが、「解説」と言えるほど詳しくは書いてないように思えました。 大体の意味を掴んだら、より詳しい解説をしているサイトとか本とかで調べなおすのがいいかと思います。

その他の回答 (5)

回答No.6

あははは、#2 : kemee さん、突っ込みありがとう、16bit で説明してましたね失敬失敬。 ついでに補足しておくと、この辺の言い回しはCPUでの動作のときに良く耳にする言葉です。 CPU演算時に、オーバーフローフラグが立つ、ボロービットが立つとか、いう言い回しがあるんです。 演算ビット桁数を超えた時に立つフラグのことで、こちらの方を調べると面白いかもしれません。

hunt9999
質問者

お礼

ありがとうございます。

回答No.5

ここに http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0 このような記述がありました。 オーバーフロー/アンダーフロー  最大値を超えた場合はオーバーフロー、絶対値の最小より小さい場合はアンダーフローという。 (実数の)指数部は・・・の範囲が表現できる。  これを下回れば算術アンダーフロー、上回れば算術オーバーフローとなる。 これが正しい表現かは不明です。

hunt9999
質問者

お礼

ありがとうございます。

noname#194317
noname#194317
回答No.3

マイナス側の桁あふれは、アンダーフローと言うこともあります。 またすでに指摘されているように、int型の大きさは処理系によってまちまちで、一定ではありません(規定もない)。最近になって、int64のように長さが解る名前が付く場合も出てきましたが、ただのintではそれが16bitか32bitか、あるいは8bitか64bitかは解りません。これはintに限らず他の型、例えばfloatが何ビット長かの規定もないので、同じことが言えそう…

hunt9999
質問者

お礼

回答ありがとうございます。 自分が調べたアンダーフロー定義は値が小さすぎて、正しい結果が得られない場合だそうです。 値が小さいとは0に近いということでdouble、float型で起こるということです。詳しい数字は分かりませんが、0.0000000001というような数字は正しく表せないという事で、オーバーフローは0から遠すぎて表すことができないという意味だと思います。色んなIT用語辞典を調べると値が大きい場合とか表現してるので誤解をうむと思いました。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

#1さん、32bitだと+2147483647/-2147483648ですよ。 32767/-32768だと16bitですね。

回答No.1

32bit の二進化システムで二の補数をマイナスとするsigned型とした場合。 扱える数字は十進表記で 32767 ~ -32768 ですが、十六進で書くと 7FFF ~ 8000 です。 十進表記で、32767 を越えた 32768 は、十六進表記で 8000、 十進表記だと -32768。 十進表記で、-32768 を下回る -32769 は、十六進表記で 7FFF、十進表記だと 32767。 見て頂いて解る通り閾値を越えると正負が逆転します。 この事をオーバーフローと言いっていますので、上下どちらも一緒です。 因に、前置きが長くなっていますが、これらには前提条件があります。 例えば int が 32bit ではないシステムは沢山あります。 また、二進で二の補数をマイナスとしない物も沢山ありますし、これらは機種依存です。 実はこの前提条件によりオーバーフローの閾値や結果が変わってきます。 今回は上記規定の場合にはこうなりますと言う話しです。

関連するQ&A

  • 「アーカイブ」って何ですか?

    「アーカイブ」って何ですか? IT用語について教えて下さい。 「アーカイブ」 「複数のファイルを一つのファイルにまとめること。」という説明でIT用語辞典に記載されているのですが、意味がいまいちわかりません。「ファイルをファイルにまとめる」とはどういうことでしょうか?「ファイルをフォルダにまとめる」なら解るのですが・・・。 アドバイスをお願いします。

  • バッファオーバーフローで疑問があります。

    スタックのバッファオーバーフローで、バッファオーバーフローを起こすことで、変数領域の内容が上書きされ、さらにスタックのその他の領域(サブルーチンの戻りアドレスなど)までも書き換わってしまうとありますが、なぜそんなことが起きるのでしょうか? 私のイメージ的に、スタックの内容が以下のようだとして、 |          | | 変数領域(B) | |------------| | 変数領域(A) | |------------| | SFP       | |------------| | 戻りアドレス | |------------| | 関数の引数  | |------------| バッファオーバーフローが起きたとしても上書きされるのは 変数領域A,Bだと思ったのですが、スタックには最大領域でも決まっていてそれおも超えるデータ量の場合は、領域いっぱいまですべて上書くようにでもなっているのでしょうか? 気になって仕方がありません。 どうかよろしくお願いいたします。

  • 【Linux】の用語辞典ありませんか?

    【Linux】のWeb用語辞典もしくわ、IT用語辞典でLinux用語がたくさん対応しているWEB用語辞典ありませんか?

  • 何故オーバーフロー??

    http://oshiete1.goo.ne.jp/qa4423673.html さらに続きになります。 #include<stdio.h> #include<string.h> #define NAME 256 // 暫定的に最大値を決めてます int Convert(const char* pInFileName, const char* pOutFileName); int ReConvert(const char* pInFileName, const char* pOutFileName); int main(){ int a,ret=-1; char InFileName[NAME]; // 入力ファイル名 char OutFileName[NAME]; // 出力ファイル名 FILE *pInFileName; // 入力ファイルポインタ FILE *pOutFileName; // 出力ファイルポインタ printf("1:コンバート 2:リコンバート\n"); scanf("%d",&a); /***** 入力ファイル名入力 *****/ printf("\n@@@@@入力ファイル名入力\n"); scanf("%s",&InFileName); // 入力ファイルオープン if((pInFileName=fopen(InFileName,"rb"))==NULL){ printf("ファイルがありません\n"); return -1; } /***** 出力ファイル名入力 *****/ printf("\n@@@@@暗号化後ファイル名入力\n"); scanf("%s",&OutFileName); // 出力ファイルオープン if((pOutFileName=fopen(OutFileName,"r"))!=NULL){ // read出来るのなら既にファイルあるという事なのでエラーにする printf("同名のファイルが既にあります\n"); return -1; } pOutFileName=fopen(OutFileName,"wb"); // 1:コンバート // 2:リコンバート // 1,2以外:終了 if(a==1){ ret=Convert((const char*)pInFileName,(const char*)pOutFileName); } else if(a==2){ ret=ReConvert((const char*)pInFileName,(const char*)pOutFileName); } if(ret==0){ printf("正常終了\n"); } else{ printf("異常終了\n"); return -1; } printf("数字+エンターで終了します\n"); scanf("%d",&a); fclose(pOutFileName); fclose(pInFileName); return 0; } /*****コンバート*****/ int Convert(const char* pInFileName, const char* pOutFileName) { unsigned char moji; while(1) { if(fread( &moji, 1, 1, (FILE*)pInFileName )>0){ fprintf((FILE*)pOutFileName,"%02x",moji); } else break; } return 0; } /*****リコンバート*****/ int ReConvert(const char* pInFileName, const char* pOutFileName) { char moji16[3]; // 16進表記 char moji10[4];★★★★★★★★★★ long i,j; while(1) { if(fread( moji16, 1, 2, (FILE*)pInFileName )>0){ for(i=0,j=0;i<2;i+=2,j++){ sscanf(&moji16[i], "%2x", moji10); } fprintf((FILE*)pOutFileName,"%c",moji10); } else break; } return 0; } 上記の char moji10[4];★★★★★★★★★★ の部分ですが、これを配列を用いずに、moji10とした場合(応じてsscanfでは&moji10になる)や moji10[2]、moji10[3]とした場合でもオーバーフローが検出されました。 sscanfの行になった時に、moji10[0]には文字が入りますが、 moji10[1]~moji10[3]まで、NULL文字'\0'が入っていました。 何故moji10[4]にしないとオーバーフローが消えないのでしょうか? 尚、Visual C++ 2008です。

  • 加減剰余のオーバーフローについて

    今C言語で加減剰余のプログラムを作っていて、 オーバーフローのチェックだけが上手くいきません。 limits.hをインクルードして、オーバーフローのチェック を行いたいのですがどうすればよいのでしょうか? 扱いたい範囲はint型の-2147483648~2147483647です。 ちなみに開発環境はvc++2005です。 一応ソースを載せておきますので、よろしくお願いします。 #pragma warning ( disable : 4996 ) #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <limits.h> int main ( int argc, char *argv[] ) { int start; // 最初に入力する値(引数1) int end; // 最後に入力する値(引数3) int kekka; // 計算結果を格納 int amari; // 除算の余りを格納 int max = INT_MAX; // 表すことが出来る最大値 int min = INT_MIN; // 表すことが出来る最小値 char enzansi; // 入力する演算子 (引数2) char str1[512]; // 格納用の配列を宣言(start用) char str2[512]; // 格納用の配列を宣言(end用) /* 引数の個数チェック */ if ( argc != 4 ) { printf ( "usage : %s start enzansi end\n", argv[0] ); exit ( 0 ); } /* 引数を取得して整数型に変換 */ start = atoi ( argv[1] ); end = atoi ( argv[3] ); /* 引数の取得 */ enzansi = ( argv[2][0] ); sprintf ( str1, "%d", start ); // str1に値を格納 sprintf ( str2, "%d", end ); // str2に値を格納 /* str1とargv[1]による文字列の比較 */ if ( strcmp ( str1, argv[1] ) ) { printf ( "error : 整数を入力して下さい。\n" ); exit ( 0 ); /* str2とargv[3]による文字列の比較 */ } else if ( strcmp ( str2, argv[3] ) ) { printf ( "error : 整数を入力して下さい。\n" ); exit ( 0 ); /* argv[2]が2文字以上の場合 */ } else if ( strlen ( argv[2] ) >= 2 ) { printf ( "error : 演算子を正しく入力して下さい。\n" ); exit ( 0 ); } /* 入力された演算子の条件ごとに計算 */ if ( enzansi == '+' ) { kekka = start + end; } else if ( enzansi == '-' ) { kekka = start - end; } else if ( enzansi == '*' ) { kekka = start * end; } else if ( enzansi == '/' ) { /* startの値を0で除算する場合 */ if ( end == 0 ) { printf ( "error : 0による除算は禁止です。\n" ); exit ( 0 ); } kekka = start % end; // 剰余を求める /* 割り算の結果として余りが出なかった場合 */ if ( kekka == 0 ) { kekka = start / end; printf ( "%d %c %d = %d", start, enzansi, end, kekka ); exit ( 0 ); /* 割り算の結果として余りが出た場合 */ } else if ( kekka != 0 ) { kekka = start / end; amari = start % end; printf ( "%d %c %d = %d余り%d", start, enzansi, end, kekka, amari ); exit ( 0 ); } /* 入力された演算子が異なる場合 */ } else { printf ( "error : '+' '-' '*' '/'のいずれかの演算子を入力して下さい。\n" ); exit ( 0 ); } /* 数値1 演算子 数値2 = 演算結果の形式で出力する */ printf ( "%d %c %d = %d", start, enzansi, end, kekka ); exit ( 0 ); } もし変な部分がありましたら指摘お願いします。 一応四則演算は問題なくできます。

  • Windowsフォーマットについて教えてください

    FAT32と16について、IT用語辞典で調べましたが、むずかしすぎてさっぱりわかりません。どうか、それぞれどういうものなのか簡単におしえていただけませんか?

  • IPマルチキャストはどういうときに使われるものですか?

    いつもお世話になっております。 IPマルチキャストについて調べてみました。 意味は理解したのですが、どういうときに使われる技術なのかが分からなかったため、 質問させて頂きました。 IT用語辞典を見ると 「マルチキャストとは、ネットワーク内で、複数の相手を指定して同じデータを送信すること。」 と書かれていました。 http://e-words.jp/w/E3839EE383ABE38381E382ADE383A3E382B9E38388.html 具体的には、どういうときに複数の相手を指定して同じデータを送信するのでしょうか? もしよろしければ、教えて頂けませんか? ぜひよろしくお願いいたします。

  • エクセルVBAについて

    エクセルVBAでプログラミングしたのですが、 どんなデータ型を使っても「オーバーフロー」 してしまいます。 重すぎるのでしょうか? 重すぎるとしたら、VBAの場合、許容範囲は どれくらいになるのでしょうか? お願いします。

  • フレッツとハブについて。

    初心者です。 用語なのですが、「フレッツ」「ハブ」とはどういう意味になるのでしょうか。 一応IT用語辞典などを見て調べたのですが、専門用語が多く、いまいち理解できませんでした。 どなたか詳しく教えて頂けませんでしょうか。

  • ソリューション

    このカテゴリーでよいかどうか迷いましたが、聞いちゃいます。 IT業界でよく「~ソリューション」とか「ソリューションビジネス」とかいう言葉を耳にしますが、これってどういう意味ですか?またどういう場合に使うのでしょう? デジタル用語辞典などでしらべても、「ソリューションプロバイダ」という用語の他には見あたらないし、英和辞典でsolutionを引くと「問題解決手法」としか出てなくて、どうもピンときません。 会社名などにも~ソリューションなんてのもあるし、いったいどういう意味なのか教えて下さい。

専門家に質問してみよう