ULARGE_INTEGERのQuadPart実数変換

[戻る]
にし 2002/03/25(月) 11:02:48
毎度お世話になります。

WindowsXPのVC++6.0 MFCで
ULARGE_INTEGER の QuadPart を実数に変換したいと思っています。

ULARGE_INTEGER temp;
CString str;
str.Format("%I64u", temp.QuadPart);  //この場合はOK
これを
str.Format( ???, temp.QuadPart/1000); で小数点を含んだ文字に変換したいですが
???の部分の書式が分かりません。このような書式は存在しないのでしょうか?

TAKA 2002/03/25(月) 12:02:13
str.Format("%I64u.%I64u", temp.QuadPart/1000,temp.QuadPart%1000);
でどうでしょう?

TAKA 2002/03/25(月) 12:07:13
>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);
ですね・・・。

不良PG 2002/03/25(月) 12:30:13
>str.Format( ???, temp.QuadPart/1000);
これで良ければこれで十分です
str.Format("%I64u",temp.QuadPart/1000); 

にしさんの意図は、恐らく
doubleの精度ならこれ
str.Format( "%f", temp.QuadPart/1000.0); 

LARGE_INTEGERの整数部と必要な小数部だとすると
文字列操作によって実現させる方法しかないですかね

にし 2002/03/25(月) 17:11:21
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への変換はインプリメントされていません”
のエラーがでます。おっしゃるように文字列操作で実現するしかないようです。

今いろいろ検討中です。何か気がついた点がありましたら、再度お願いします。

TAKA 2002/03/25(月) 17:24:49
> wk = (int)(temp.QuadPart%(1000/1000/1000))
wk = (int)(temp.QuadPart%(1000*1000*1000))
では?

不良PG 2002/03/25(月) 17:27:02
>商と剰余を別々に計算して、文字列で結合する方法でこれで実現可能かと思いますが、
>ただ、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への変換はインプリメントされていません”
イメージで書いたので試していませんでした・・(^^;;;;

TAKA 2002/03/25(月) 17:31:01
やりたいのはこういうことですか?
temp.QuadPart ドライブ容量
メガ単位に変更(切り捨て)
wk = (int)(temp.QuadPart/(1000*1000))

str.Format("%d.%03d",wk/1000,wk%1000);
又は
str.Format("%10.3f",(double)wk);

不良PG 2002/03/25(月) 17:37:33
すみません
>よって10ビット右シフトで対応できそうですね
シフトじゃ小数以下でませんね(汗)

dairygoods 2002/03/25(月) 17:48:05
普通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バイトを超えるとダメですが。

にし 2002/03/25(月) 20:12:55
[[解決]]
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にしますか。

皆さん、いろいろ有難うございました。

不良PG 2002/03/25(月) 20:22:30
>エクスプローラの右クリックでドライブのプロパテーをみると、1000と1024の
>両方のサイズが出る
そんなことは、無いでしよう・・
1つは、バイト単位で、もう一つがキロバイトorメガバイトorギガバイトorテラバイト(ある
かな?)だと思うのですが・・

にし 2002/03/25(月) 21:19:23
あれっ? そうですか。
私のPC(WindowsXP)では、たとえばCドライブプロパテーの全般タブをみると
使用領域、空き領域、容量の表示があり、それぞれに2種類の表示があります。
使用領域で言えば、左側の表示は12728946688バイト、右側の表示は11.8GBで数字が
違っているので、1000と1024で計算した差かなと思っていましたが。

不良PG 2002/03/26(火) 01:46:29
>使用領域、空き領域、容量の表示があり、それぞれに2種類の表示があります。
>使用領域で言えば、左側の表示は12728946688バイト、右側の表示は11.8GBで数字が
>違っているので、1000と1024で計算した差かなと思っていましたが。
左側の表示が実際のバイト数で右側は、単位をギガバイトにしただけですよ。

12728946688÷1024÷1024÷1024
  =11.854755401611328125
  =11.8(少数第二位を切り捨て)

にし 2002/03/26(火) 08:58:04
>単位をギガバイトにしただけですよ。

なるほど。 分かりました。

古いスレッドには追加発言できません。