毎度お世話になります。
WindowsXPのVC++6.0 MFCで
ULARGE_INTEGER の QuadPart を実数に変換したいと思っています。
ULARGE_INTEGER temp;
CString str;
str.Format(%I64u, temp.QuadPart); //この場合はOK
これを
str.Format( ???, temp.QuadPart/1000); で小数点を含んだ文字に変換したいですが
???の部分の書式が分かりません。このような書式は存在しないのでしょうか?
str.Format(%I64u.%I64u, temp.QuadPart/1000,temp.QuadPart%1000);
でどうでしょう?
>str.Format(%I64u.%I64u, temp.QuadPart/1000,temp.QuadPart%1000);
すみません。
int wk;
wk = (int)(temp.QuadPart%1000);
str.Format(%I64u.%03d, temp.QuadPart/1000,wk);
ですね・・・。
>str.Format( ???, temp.QuadPart/1000);
これで良ければこれで十分です
str.Format(%I64u,temp.QuadPart/1000);
にしさんの意図は、恐らく
doubleの精度ならこれ
str.Format( %f, temp.QuadPart/1000.0);
LARGE_INTEGERの整数部と必要な小数部だとすると
文字列操作によって実現させる方法しかないですかね
TAKAさん 有難うございます。
不良PGさん 有難うございます。
すみません。 ちょっと説明不足でしたので補正します。
目的はドライブの総容量、空き容量等をGB単位で表示したいと思っています。
たとえば、12.345GBといった具合です。
>wk = (int)(temp.QuadPart%1000); は
商と剰余を別々に計算して、文字列で結合する方法でこれで実現可能かと思いますが、
ただ、GB単位に変換するために wk = (int)(temp.QuadPart%(1000/1000/1000))と
したところ、 ”Warning C4724 剰余の2番目のオペランドはコンパイル時に0と
評価され、不定の結果を返します” の警告がでました。私の説明不足でした。
>str.Format( %f, temp.QuadPart/1000.0); は
”error C2520 Unsigned-int64からdoubleへの変換はインプリメントされていません”
のエラーがでます。おっしゃるように文字列操作で実現するしかないようです。
今いろいろ検討中です。何か気がついた点がありましたら、再度お願いします。
> wk = (int)(temp.QuadPart%(1000/1000/1000))
wk = (int)(temp.QuadPart%(1000*1000*1000))
では?
>商と剰余を別々に計算して、文字列で結合する方法でこれで実現可能かと思いますが、
>ただ、GB単位に変換するために wk = (int)(temp.QuadPart%(1000/1000/1000))と
>したところ、 ”Warning C4724 剰余の2番目のオペランドはコンパイル時に0と
>評価され、不定の結果を返します” の警告がでました。私の説明不足でした。
ディスク容量の場合は、1000ではなく、1024で計算しましょう
よって10ビット右シフトで対応できそうですね
(Int64ShrlMod32こんなのあります)
あとは、3桁ごとにカンマを付ければ良さそうです
ただ、またもや、試してません(汗)
>>str.Format( %f, temp.QuadPart/1000.0); は
>”error C2520 Unsigned-int64からdoubleへの変換はインプリメントされていません”
イメージで書いたので試していませんでした・・(^^;;;;
やりたいのはこういうことですか?
temp.QuadPart ドライブ容量
メガ単位に変更(切り捨て)
wk = (int)(temp.QuadPart/(1000*1000))
str.Format(%d.%03d,wk/1000,wk%1000);
又は
str.Format(%10.3f,(double)wk);
すみません
>よって10ビット右シフトで対応できそうですね
シフトじゃ小数以下でませんね(汗)
普通1キロ=1024=2の10乗ですので、そのほうがよいと思います。
> (int)(temp.QuadPart%(1000/1000/1000))
これは、(int)(temp.QuadPart%(1000*1000*1000)) ですね…。
> ”error C2520 Unsigned-int64からdoubleへの変換はインプリメントされていません”
Signed-int64からdoubleへは変換できると思うのですが、
(double)(LONGLONG)temp.QuadPart/1024/1024/1024;
と強引に符号ありに変換してはどうでしょうか?
ディスクサイズが0x7FFFFFFFFFFFFFFFバイトを超えるとダメですが。
TAKAさん 有難うございました。
不良PGさん 有難うございまました。
dairygoodsさん 有難うございました。
>wk = (int)(temp.QuadPart/(1000*1000));
>str.Format(%d.%03d,wk/1000,wk%1000);
>(double)(LONGLONG)temp.QuadPart/1024/1024/1024;
両方で出来ました。
> wk = (int)(temp.QuadPart%(1000/1000/1000))
私の勘違いです(大汗)。 余計なお手数をかけてすみませんでした。
>ディスク容量の場合は、1000ではなく、1024で計算しましょう。
>普通1キロ=1024=2の10乗ですので、そのほうがよいと思います。
そうですね。
エクスプローラの右クリックでドライブのプロパテーをみると、1000と1024の
両方のサイズが出るので、どっちにするか迷っていましたが、実際使える容量は
1024の方ですから、1024にしますか。
皆さん、いろいろ有難うございました。
>エクスプローラの右クリックでドライブのプロパテーをみると、1000と1024の
>両方のサイズが出る
そんなことは、無いでしよう・・
1つは、バイト単位で、もう一つがキロバイトorメガバイトorギガバイトorテラバイト(ある
かな?)だと思うのですが・・
あれっ? そうですか。
私のPC(WindowsXP)では、たとえばCドライブプロパテーの全般タブをみると
使用領域、空き領域、容量の表示があり、それぞれに2種類の表示があります。
使用領域で言えば、左側の表示は12728946688バイト、右側の表示は11.8GBで数字が
違っているので、1000と1024で計算した差かなと思っていましたが。
>使用領域、空き領域、容量の表示があり、それぞれに2種類の表示があります。
>使用領域で言えば、左側の表示は12728946688バイト、右側の表示は11.8GBで数字が
>違っているので、1000と1024で計算した差かなと思っていましたが。
左側の表示が実際のバイト数で右側は、単位をギガバイトにしただけですよ。
12728946688÷1024÷1024÷1024
=11.854755401611328125
=11.8(少数第二位を切り捨て)
>単位をギガバイトにしただけですよ。
なるほど。 分かりました。