C言語で計算結果が100億になるものを扱いたいのですが,表示すると1410065408と表示されてしまいます.表示としてはこうなっていますが,実際に計算に使う分には100億ということになっているのでしょうか.また,これを表示する方法はありますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
質問者のコンパイラがはっきりしないことと、使ったコードを示していないので、適格なアドバイスができにくい状況ですが、取り急ぎ私のコンパイラ(GCC 5.4.0 x86_64)で実験コードを動かした結果を示します。
C
1#include <stdio.h> 2int main(void) 3{ 4 long int bignum = 0; 5 int billion = 1000000000; // 10億 6 int small = 0; 7 8 for (int i = 0; i < 10; i++) { 9 small += billion; 10 bignum += billion; 11 printf(" %3d: %12ld = %p, %12d = 0x%x, %12d\n", 12 i, bignum, (char*)bignum, (int)bignum, bignum, small); 13 } 14 printf("%d = sizeof(int) \n", sizeof(int)); 15 printf("%d = sizeof(long int)\n", sizeof(long int)); 16 return 0; 17}
コンパイルすると様々 warning (警告)が出ますが、それは置いといて、実行させた結果が次です。
sh
1$ ./a.out 2 0: 1000000000 = 0x3b9aca00, 1000000000 = 0x3b9aca00, 1000000000 3 1: 2000000000 = 0x77359400, 2000000000 = 0x77359400, 2000000000 4 2: 3000000000 = 0xb2d05e00, -1294967296 = 0xb2d05e00, -1294967296 5 3: 4000000000 = 0xee6b2800, -294967296 = 0xee6b2800, -294967296 6 4: 5000000000 = 0x12a05f200, 705032704 = 0x2a05f200, 705032704 7 5: 6000000000 = 0x165a0bc00, 1705032704 = 0x65a0bc00, 1705032704 8 6: 7000000000 = 0x1a13b8600, -1589934592 = 0xa13b8600, -1589934592 9 7: 8000000000 = 0x1dcd65000, -589934592 = 0xdcd65000, -589934592 10 8: 9000000000 = 0x218711a00, 410065408 = 0x18711a00, 410065408 11 9: 10000000000 = 0x2540be400, 1410065408 = 0x540be400, 1410065408 124 = sizeof(int) 138 = 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 13:23
編集2019/12/06 13:29総合スコア1382
0
投稿2019/12/06 11:56
編集2019/12/06 12:03総合スコア1248
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/06 12:15
2019/12/06 12:19
2019/12/06 12:25 編集
2019/12/06 12:29
2019/12/06 12:50 編集
2019/12/06 12:56
2019/12/06 13:15
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/06 13:31
2019/12/06 13:35
2019/12/06 13:52