Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@YankeeDeltaBravo225

オーバーフロー/アンダーフローについてまとめてみた

More than 1 year has passed since last update.

はじめに

オーバーフロー、アンダーフローは意味が曖昧なまま使われているので、
一般的にどのような定義になっているのかまとめて見ました。

注意:
「うちは社内方言でこうだ」と言うのを否定するものではありません。

種類

一般的な定義の有無は対象が整数なのか浮動小数点数なのか、
はたまたバッファなのかによって異なるようです。

いかに示す通り、整数のアンダーフローのみ一般的な定義はありません。

オーバーフロー アンダーフロー
整数 YES NO
浮動小数点数 YES YES
バッファ YES YES

整数

オーバーフロー

そのビット幅で表現できる範囲の最大値を上回った場合、下限を下回った場合がオーバーフローです。
Wikipedia : https://en.wikipedia.org/wiki/Integer_overflow

8bitの符号なし整数に入る値の範囲は0~255ですが、これを超えた場合が以下の例です。

#include<stdio.h>
#include<stdint.h>

void main(void)
{
    uint8_t a = 255;
    printf("a:%d\n", a);

    a++;
    printf("a:%d\n", a);
}

結果:
このようにa++の結果、aは256にはならず0になります。

a:255
a:0

下限を下回った場合も オーバーフロー です。
以下の例は上記と同様ですが、今度は下限値0から更にデクリメントしています。

    uint8_t b = 0;
    printf("b:%d\n", b);

    b--;
    printf("b:%d\n", b);

結果:

b:0
b:255

アンダーフロー

整数の場合、一般的な定義は特に無いようです。

浮動小数点数

MSDNの記事が良い感じにまとまっています。
https://msdn.microsoft.com/ja-jp/library/hd7199ke.aspx

オーバーフロー

整数型と同じように、浮動小数点数型にも表現できる最大数があります。
詳しくは上記のMSDNのページをご覧ください。

アンダーフロー

こちらは整数型にはない要素です。

値が限りなく0に近づいて表現しきれなくなると、浮動小数点数で表現しきれなくなります。
Wikipedia : https://en.wikipedia.org/wiki/Arithmetic_underflow

しかし、用途によっては単に0と扱ってしまえば良かったりもします。

バッファ

オーバーフロー

Wikipedia : https://en.wikipedia.org/wiki/Buffer_overflow

確保している領域からはみ出してアクセスしてしまう事です。
PCなどのリッチな環境だとMMUで止めてくれたりしますが、
組み込み系の場合、特にスタックオーバーフローすると被害が甚大です。

ありがちな例:

    uint8_t  buf[4];

    /* Correct condition is "i < 4" */
    for(i = 0; i <= 4; i++){
        buf[i] = i;
    }

アンダーフロー

バッファアンダーランの別名です。
オンラインの動画配信サービスで再生が止まるのは
再生用バッファの枯渇(=アンダーラン)によるものです。

ソース

一応、Githubに上げておきました。
https://github.com/YankeeDeltaBravo225/Overflow_sample

バッファオーバーフローのやつは環境によっては
セグメント違反が起きるかもしれないので要注意です。

7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
YankeeDeltaBravo225
組み込み系ドナキチPです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?