• ベストアンサー

INT64対応のprintf系関数はありますか?

WindowsXP & Visual C++という環境でソフト開発しています。 大きな整数を扱うのでINT64を使用しているのですが、sprintf関数で整数を表示する為に「%d」を使うと、32ビット整数にしか対応していないらしく、正しく動作しないことが分かりました。 64ビット整数に対応したprintf系の関数群は存在するのでしょうか?

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★VC++のバージョンは何でしょうか? ・VC++6.0以前…long long型には対応していない(書式制御文字列については分かりません)  VC++2003……long long型には対応、ただし書式制御文字列は『%I64d』『%I64u』です。  VC++2005……long long型に対応、書式制御文字列は『%lld』『%llu』です。  VC++2008……VC++2005と同じだと思う(未確認) ・参考にして下さい。

BearCave
質問者

お礼

%I64dで解決しました。ありがとうございました。

その他の回答 (3)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.4

long long int て必ず 64bit なんでしたっけ? わざわざ型の宣言で long long int でなくて明示的に INT64 としているのだっだら、書式指定時にも %I64d とした方がよいような気がする。

BearCave
質問者

お礼

%I64dで解決しました。ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

手元で調べた限りでは long long が 64ビットのようだから, %lld でいけるはず. 他の処理系のことも考えるならこっちの方が安全. C99 なら inttypes.h を #include すればいいんだけど, Microsoft って C99 に対応したがらないんですよね.

BearCave
質問者

お礼

%I64dで解決しました。ありがとうございました。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

MSDN には ----- 書式指定は、省略可能なフィールドと必須フィールドを使用して次の形式で行います。 %[flags] [width] [.precision] [{h | l | ll | I | I32 | I64}]type ----- て書いてあるから、%I64d とか書けばいいんじゃない?

BearCave
質問者

お礼

%I64dで解決しました。ありがとうございました。

関連するQ&A

  • printf、最大値の出し方

    3つの整数を入力し、どれが最大値かを判別するプログラムを作りたいです。 #include<stdio.h> main() { int i, x, max; max = 0; i = 1; while(i <= 3) { printf("整数:"); scanf("%d",&x); if (x > max) { max = x; } i++; } printf("最も大きい整数は%d\n", max); } とすると 整数:と3回表示されますが、これを一つ目の整数:、二つ目の整数:3つ目の整数:と表示されるようなプログラムにするにはどうしたらよいでしょうか。

  • printf()で出力したいんですが?

    #include <stdio.h> int main( void ) { int air[4]; int i; i = 0; printf( "データ入力\n" ); do{ scanf( "%d\t", &air[ i++ ]); } while(air[ i - 1 ] > 0 ); printf( "%d\n", i ); return 0; } このプログラムはコンパイル出来ますが、期待していたprintf関数での出力ができません。 その理由として何がありますか?関数の使い方が間違っているのか、DO~WHILE文が使えない場所 なのか、もし直すとすればどう直せばいいのですか。

  • intとlongは同じ?

    #include <stdio.h> #include <limits.h> int main() { printf("%d\n%d", INT_MAX, LONG_MAX); return 0; } 出力 214783647 214783647 Win7 64bit (VC++2010) CentOS 32bit (gcc) どちらの環境でも同じ出力結果となりました。 intとlongなぜ同じになってしまったのでしょうか。

  • に対応する関数ヘッダがありませんと言って動きません

    に対応する関数ヘッダがありませんと言って動きません それと使っているコンパイラは visual C++ express editionです これが問題のプログラムです まだデバッグなどは終わってないのでその関数ヘッダに関することに重点を置いた 回答を期待しております #include <stdio.h> /*数当てゲーム*/ int main(void); { do{ int no,sum; printf("任意の数字を1から31から選んでください"); printf("その数は奇数ですか?-Yes...9/No...0\n"); scanf("%d",&no); sum=0; /*ある法則にしたがっての数当て*/ if(no==9) sum=sum++; printf("その数は2,3,6,7,10,11,14,15,18,19\n22,23,26,27,30,31の中に含まれていますか?\nYes...9/No...0\n"); scanf("%d",&no); if(no==9) sum=sum+2; printf("その数は4,5,6,7,12,13,14,15,20\n21,22,23,28,29,30,31の中に含まれていますか?\nYes...9/No...0\n"); scanf("%d",&no); if(no==9) sum=sum+4; printf("その数は8,9,10,11,12,13,14,15,24\n25,26,27,28,29,30,31の中に含まれていますか?\nYes...9/No...0\n"); scanf("%d,&no"); if(no==9) sum=sum+8; printf("その数は16,17,18,19,20,21,22,23\n24,25,26,27,28,29,30,31の中に含まれていますか?\nYes...9/No...0\n"); scanf("%d,&no"); if(no==9) sum=sum+16; printf("あなたの入力した数字は%dであっていますか?\nYes...9.No...0\n,sum"); scanf("%d,&no"); if(no==9) printf("あなたは正直者です"); else printf("あなたはひねくれ者かうそつきです"); printf("もう一度?Yes...9.No...0"); scanf("%d,&no"); }while(no==9); return(0); } どうぞよろしくお願いします

  • int rev_int(int num)文  関数の入門

    #include<stdio.h> /*---非負の整数を読み込んでます*/ int scan_uint(void) //関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。 { //この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。 int tmp;//テンプの箱作成 do { printf("非負の整数を入力してください:"); scanf("%d", &tmp); if (tmp < 0) printf("\a負の数を入力しないでください"); } while (tmp < 0); return (tmp); } /* 非負の整数を逆転した値を返す */ int rev_int(int num) { int tmp = 0; if (num > 0){ do { tmp = tmp * 10 + num % 10; num /= 10; }while (num > 0); } return (tmp); } int main(void) { int nx = scan_uint(); printf("反転した値は%dです。\n", rev_int(nx)); return 0; } 教えてください!参考書に書いてあることをまとめて プログラムを読んでるのですが、わからない部分があります。 (1)まずint scan_uint(void)からこのプログラムは読み込んでるのでしょうか? どこかのサイトを調べたら、最初にint mainからプログラムは 読み込むというのを観たのですが、コンパイルして実行した動きをみるかぎり一番最初はint scan_uint(void)から読んでるように見えます。。。 (2)int scan_uint(void)の文は理解できました。私なりに解釈したのは ここでは正の数を入力しないと次に進まないことと 負の数を入力した場合、負の数を入力しないでくださいと注意がずっと でるという文です。 質問ですが、このあとint rev_int(int num)文に移ると思うのですが ここの int tmp = 0; これはこのint rev_int(int num)文のみの tmpの箱と参考書に記載がありました。つまり int scan_uint(void)で 出てきたtmpとは別個と解釈しました。 そうなると、int rev_int(int num)文を読んでみると tmpの箱を作成。そこは0を代入。 if文で num>0の時、 do文に入る (ここでいうnumは int numと宣言してないですけど、またscanfとか作って値はまだいれてないですけど??) do文は tmp = tmp*10 + num %10 num /=10 wile(num>0) これを見る限り、numという箱が見えません。全体を見渡しても どこかでnumに値が代入されたのち、このint rev_int(int num) という文を読みこんでいき if num>0のときと宣言されていますが もっと前の段階でnumの値が入力されていない限り このif文は適用されないと思ったのですが、プログラムは動いてます 三つ目の質問です tmp = tmp *10 + num % 10 num /=10 の部分がわかりませんでした。 tmpはまず、int scan_uint(void)で作成したtmpと int rev_intで登場してきたtmpとは別個と参考書に書いてあるのが 正しいのであれば tmpの値はここでは初のはずです。 一体いつ値を入力したのでしょうか? もしも一番最初のscanfの時に入力した例えば12345が此処でも適用されるなら tmp = 12345 ×10 + num % 10を tmpに代入するって文になりますが どうしてtmpを10かけるのですか?123450になり、 そのあとnumの値が此処でもまだ不明なのですがnum/10したものと 足すみたいですが、わかりませんでした。。。 まとめると、tmp = tmp*10+num%10がわかりません。 また、numとは何かわかりません、値もどの値がどこで代入されていて while(num>0)が引っかかるのか不明です。 tmpはint scan_uint文内で入力した値(scanfの部分で) 12345と仮に入力したら、それは次のint rev_int(int num)でも続いて活用されてるのですか? 参考書はなぜ別個と書いてるのかわかりません。 ごめんなさい>_< とても長くなりました。 どなたか解る方、教えてください、よろしくおねがいします。

  • printf関数の振る舞い?に関して

    皆様、こんにちは。 C言語のデバッグに関して詳しい方どなたか教えてください。 現在、静的SQLを使ったC言語でのプログラム開発をおこなっております。DBはIBM DB2で、マシンはAS400、言語は C/400です。最初はPCで、Microsoft Visual Stadio .NET 2003で開発して、やはりPC上のIBM DB2にアクセスしてテストしておりました。 問題のCのソースはステップ数が巨大(Cで5,000ステップ)なため、printf関数をとこどどころに入れてテストしておりました(プリコンパイル→コンパイルの作業がある為?にデバッガーは使えなかった為)。 全てのテストが完了したので、ソース上からprintf関数を全て削除して、実行させてみました。 ところがprintf文が入って、正しい結果を出力していたころのプログラムとは思えないほどの、エラーが続出しました。 まず、メモリーエラーと思われるエラー、永久ループ、重複レコード出力エラーなどです。これらは今までと、同じデータで実行したので、全く同じロジックを通るはずなのですが、まるで別人のような振る舞いをしまます。 以前、デバッガーにはデバッガー自身が動くためにメモリーを整理して実行するため、このような事がおきるとは聞いておりましたが、ただのprintf関数で、このような事が起きる事があるのでしょうか? 本プログラムはstrcpyやstrcmp関数が多用されていて、NULL -STOPが正しくセットされていないのではかと、現在調査・改修しているところです。 皆様、このような現象って何が考えられるでしょうか? 宜しくお願いいたします。

  • EXCELの関数式(INT,MOD)で教えて下さい

    下図のようなEXCELの表があります。 金種計算で、1行目は1万円、5千円、千円・・・10円と入っており、 A2は計算したい金額(97810)を入れています。 B2セルの式=INT($A2/B1)、C2セルの式=INT(MOD($A2,B1)/C1)で、C2セルの式はD2~H2に複写しています。 EXCELで得た計算結果(2行目)は正しいと思うのですが、 D2,F2,H2の計算結果と、自分で計算した結果があいません。 ここを詳しく教えて頂けないでしょうか。 宜しくお願い致します! INT関数:整数部を返す MOD関数:剰余を返す  |  A  |  B |  C |  D |  E |  F |  G |  H | 1|   |10000| 5000| 1000| 500| 100|  50 |   10| 2|97810|   9|   1|   2|    1|   3|   0|   1| B2は、98710÷10000=9.7810→整数部を返すので「9」 C2は、97810÷10000=9.7810→剰余7810÷5000=1.562 →整数部を返すので「1」 D2は、97810÷5000=19.562→剰余562÷1000=0.562 →整数部を返すので「0」??? E2は、97810÷1000=97.810→剰余810÷500=1.62 →整数部を返すので「1」 F2は、97810÷500=195.62→剰余62÷100=0.62 →整数部を返すので「0」??? G2は、97810÷100=978.10→剰余10÷50=0.2 →整数部を返すので「0」 H2は、97810÷50=1956.2→剰余2÷10=0.2 →整数部を返すので「0」???

  • printf()関数の括弧を二重にして、printf((~~~))とし

    printf()関数の括弧を二重にして、printf((~~~))として コンパイル/実行すると、実行時セグメンテーション違反が発生します。 コンパイル時には警告も発生しますが、このセグメンテーション違反が なぜ起こるのか理由がよくわかりません。ご回答いただけるとありがたいです。 以下、サンプルコードと実行例です。よろしくお願いいたします。 ---mytest.c---- 1 #include <stdio.h> 2 3 int main(void){ 4 5 //printf("test:%d", 1)ではもちろんコンパイル/実行に成功する。 6 printf(("test:%d", 1)); 7 return 0; 8 } 【コンパイル/実行結果/gccバージョン】 #gcc main.c main.c:6:警告:passing argument 1 of printf makes pointer from integer without a cast #./a.out セグメンテーション違反です # gcc --version gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27) ・ ・

  • C言語で、printfのような関数の定義方法

    わかりにくい説明しかできないので例をあげます。 「 PutFormatString 」という関数を定義したとして、 int year = 2009 ; PutFormatString( "今年は%d年です。\n" , year ); を実行すると、関数の内部でprintf文が実行され、 今年は2009年です。 と表示されるようにするためには どのように関数を定義すればよいのでしょうか? printf文とセットで行う処理を何度も書くのが面倒なため、 関数としてまとめようと思ったのですが、行き詰まってしまいました。

  • int型とfloat型の演算結果

    C初心者です。 int型とfloat型で割り算をして処理を表示させてます。 以下、実処理の一部です。 int a; int b; a = 3; b = 2; (1) printf("答え=%d:1のはず\n",a/b); (2) printf("答え=%d:1のはず\n",a/(float)b); (3) printf("答え=%d:1のはず\n",(float)a/b); (4) printf("答え=%d:1のはず\n",(float)a/(float)b); 私の予想では(1)~(4)まですべて1が表示されると思っていました。 実際は(1)のみ1で(2)~(4)は0でした。 (2)~(4)はなぜ0と表示されるのですか? ・整数型と実数型で演算した場合、実数型に合わせられてること ・表示が整数型であること なので1が表示されると予想したのですが・・・。

専門家に質問してみよう