質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.07%

int型でオーバーフローを起こしてしまい1410065408と表示される

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 665

vaitarika

score 29

C言語で計算結果が100億になるものを扱いたいのですが,表示すると1410065408と表示されてしまいます.表示としてはこうなっていますが,実際に計算に使う分には100億ということになっているのでしょうか.また,これを表示する方法はありますか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

int型でなくunsigned long long型を使うことで64ビット分の情報を格納できます.
参考

最大で18,446,744,073,709,551,615まで使えるそうです.最大値はULLONG_MAXで表示できます.
参考

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/06 21:49 編集

    @fiveHundred さん
    long longは64bit以上であることは保証されているので、問題無いように思います。

    キャンセル

  • 2019/12/06 21:56

    > LouiS0616 さん
    すいません。そこまで知りませんでした。
    失礼しました。

    キャンセル

  • 2019/12/06 22:15

    > int _____________at least 16
    > long int _________at least 32
    > long long int(C99) _at least 64

    > Besides the minimal bit counts, the C Standard guarantees that
    > 1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).

    https://en.cppreference.com/w/c/language/arithmetic_types

    ---
    とは言えビット数が固定されないのは扱いづらいので、Fixed width integer types というものがC99以降導入されているのですが... 環境に依っては実装されていない型があったり、リテラル表記が無かったり(特に今回のケースでは ll サフィックスに頼るしかなくなんか残念な感じ)、ちょっと使いづらい印象です。

    https://en.cppreference.com/w/c/types/integer

    キャンセル

0

質問者のコンパイラがはっきりしないことと、使ったコードを示していないので、適格なアドバイスができにくい状況ですが、取り急ぎ私のコンパイラ(GCC 5.4.0 x86_64)で実験コードを動かした結果を示します。

#include <stdio.h>
int main(void)
{
    long int bignum = 0;
    int billion = 1000000000; // 10億
    int small = 0;

    for (int i = 0; i < 10; i++) {
        small += billion;
        bignum += billion;
        printf(" %3d: %12ld = %p, %12d = 0x%x, %12d\n",
               i, bignum, (char*)bignum, (int)bignum, bignum, small);
    }
    printf("%d = sizeof(int)     \n", sizeof(int));
    printf("%d = sizeof(long int)\n", sizeof(long int));
    return 0;
}


コンパイルすると様々 warning (警告)が出ますが、それは置いといて、実行させた結果が次です。

$ ./a.out 
   0:   1000000000 = 0x3b9aca00,   1000000000 = 0x3b9aca00,   1000000000
   1:   2000000000 = 0x77359400,   2000000000 = 0x77359400,   2000000000
   2:   3000000000 = 0xb2d05e00,  -1294967296 = 0xb2d05e00,  -1294967296
   3:   4000000000 = 0xee6b2800,   -294967296 = 0xee6b2800,   -294967296
   4:   5000000000 = 0x12a05f200,    705032704 = 0x2a05f200,    705032704
   5:   6000000000 = 0x165a0bc00,   1705032704 = 0x65a0bc00,   1705032704
   6:   7000000000 = 0x1a13b8600,  -1589934592 = 0xa13b8600,  -1589934592
   7:   8000000000 = 0x1dcd65000,   -589934592 = 0xdcd65000,   -589934592
   8:   9000000000 = 0x218711a00,    410065408 = 0x18711a00,    410065408
   9:  10000000000 = 0x2540be400,   1410065408 = 0x540be400,   1410065408
4 = sizeof(int)     
8 = sizeof(long int)


普通のCコンパイラは int が 32bit で約±21億まで扱えます。long int は今時のコンパイラだと 64bit だと期待でき、64bit なら100億は余裕で扱えます。
私のコードは 10億(billion変数)を bignum に10回足しこんで100億を目指しつつ、途中経過を複数の表示方法(%12ld, %12d, %x)で表示しています。
同時に int 型の small 変数に足しこんだものも表示してみています。
コードの最後で int と long int のサイズを表示しました。

100億を表示しているのは long int 型変数を %ld 変換指定で表示した場合です。100億は少なくとも34bit必要であることがわかります。
そして、100億のところで  1410065408  が表示されています。この表示は、34bitの数値の、下位32bitを表示したものです。

取り急ぎ、このコードと表示結果を参考にしてみてください。
まずは、long int, long long int など、大きな整数型の sizeof を確認することからやり直したらいかが?その次は printf() の変換指定を調べることかな。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/06 22:31

    回答ありがとうございます.教えていただいたコードを動かしたところ以下のように出力されました.
    0: 1000000000 = 3B9ACA00, 1000000000 = 0x3b9aca00, 1000000000
    1: 2000000000 = 77359400, 2000000000 = 0x77359400, 2000000000
    2: -1294967296 = B2D05E00, -1294967296 = 0xb2d05e00, -1294967296
    3: -294967296 = EE6B2800, -294967296 = 0xee6b2800, -294967296
    4: 705032704 = 2A05F200, 705032704 = 0x2a05f200, 705032704
    5: 1705032704 = 65A0BC00, 1705032704 = 0x65a0bc00, 1705032704
    6: -1589934592 = A13B8600, -1589934592 = 0xa13b8600, -1589934592
    7: -589934592 = DCD65000, -589934592 = 0xdcd65000, -589934592
    8: 410065408 = 18711A00, 410065408 = 0x18711a00, 410065408
    9: 1410065408 = 540BE400, 1410065408 = 0x540be400, 1410065408
    4 = sizeof(int)
    4 = sizeof(long int)
    これはどういうことでしょうか。

    キャンセル

  • 2019/12/06 22:35

    あなたのコンパイラの long int 型は 32bit しかないので 100億を表現できない、ということです。
    long int を long long int にするとかして 64 ビットの型があるのであれば、良いのですが、それが無いなら別の手段を使うか、コンパイラを替えるか・・・でしょう。

    キャンセル

  • 2019/12/06 22:52

    gcc (MinGW.org GCC-6.3.0-1) 6.3.0 ですか。
    それは32bit コンパイラかもしれません。long long int 型も32bitかな?だとすると、ひとつの変数で100億を扱うことはできないということ。その場合、多倍長計算などと呼ぶ方法をとります。例えば int 型(=32bit)を2個使って64bitの値を扱うことにすれば100億を表現できるようになるわけだ。。。

    キャンセル

-1

こちらのように、INT_MAXで最大値が確認できます。
大概の環境では21億程度なので、それ以上の数値を使いたいのであれば、他の型を使う必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る