- ベストアンサー
%dについて
sprintf(XXX,%d,1234567890123) の様な記述をして XXXはINSERT用のSQL文でSUUというフィールドの値として設定します。 SUUはNUMBER型で13桁確保してあります。 INSERT処理後SUUの中を見てみると全然関係ない値が入っています。 他のフィールドと間違えていることはありません。 %ld等でも試したがダメでした。 色々な数字で試してみたのですが10桁まではエラーが出ないことがわかりました。11桁目からエラーが出ます。 この原因がわかる方はいらっしゃいますでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
%lld ですが、Visuasl Studio 2003 (VC7.1)でもサポートされていないので、VC6でも使えないと思います。 VC7.1に関して云えば、%I64d で64bit長のint型(__int64)の出力はできました。これがVC6で使えるかどうかは分かりません。 > sprintf(XXX,%lld,1234567890123) > でINSERTしたら1912276171という値が入っていました。 1234566780123 % (ULONG_MAX+1) = 1912276171 なので、32bit分しか 有効になっていないからですね。 int main() { __int64 i; i = 1234567890123; printf("%I64d\n", i); printf("%d\n", i); printf("%d\n", i & 0xffffffff); printf("%I64d\n", i % ((__int64)ULONG_MAX+1)); printf("%d\n", INT_MAX); return 0; } 出力結果: 1234567890123 1912276171 1912276171 1912276171 1912276171 2147483647
その他の回答 (4)
- kaha
- ベストアンサー率23% (41/177)
> sprintf(XXX,%lld,1234567890123) > でINSERTしたら1912276171という値が入っていました。 #include <stdio.h> void main() { char xxx[256]; sprintf(xxx,"%lld",1234567890123LL); printf(xxx); } VC++2005の環境ですが、上記でプログラムで試したら、ちゃんと1234567890123と表示されました。 1912276171となったのなら、"%lld"とせずに"%ld"としたのでは? 余談ですが、 sprintf(xxx,"%I64d",1234567890123); でも、ちゃんと1234567890123と表示されました。
お礼
ありがとうございます。 sprintf(xxx,"%I64d",1234567890123); で出来ました。 >"%lld"とせずに"%ld"としたのでは? %ldの間違いではありません。 %lld使えないみたいですね^^;
- jacta
- ベストアンサー率26% (845/3158)
いろいろと怪しい箇所があります。 そもそも、 > sprintf(XXX,%d,1234567890123) はコンパイルできませんね。%dのところは"%d"でしょうか? 次に、書式指定%dはint型の実引数を期待しています。 10進数で13桁以上を格納するには、44ビット以上(符号付きの場合は45ビット以上)必要になりますが、int型のビット幅はいくらなのでしょうか?
補足
>> sprintf(XXX,%d,1234567890123) >はコンパイルできませんね。%dのところは"%d"でしょうか? はい。%dです。コンパイルもエラー出ないです。
- acombun
- ベストアンサー率16% (16/99)
整数で扱える数を超えているからじゃないですか。
補足
%ldなどいろいろやってみましたがダメでした^^;
- tatsu99
- ベストアンサー率52% (391/751)
稼働しているシステム名とコンパイラが不明なのですが、int型のデータでは、10桁までしか対応できませんので、当然の結果です。 従って13桁以上を望むのであれば、 long long int型を使用することになります。 sprintf(XXX,%lld,1234567890123LL) が使えれば、long long int型がサポートされています。だめな場合は、double float型で代替えする方法もありますが、まずは、この方法で試して下さい。
補足
sprintf(XXX,%lld,1234567890123) でINSERTしたら1912276171という値が入っていました。 Visual C++6.0にて実行しています。
お礼
>printf("%I64d\n", i); これでうまくいきました。VB6で使えるみたいですね^^ ありがとうございます。