ULARGE_INTEGERのQuadPart実数変換 – プログラミング – Home

ULARGE_INTEGERのQuad...
 
通知
すべてクリア

[解決済] ULARGE_INTEGERのQuadPart実数変換


にし
 にし
(@にし)
ゲスト
結合: 23年前
投稿: 22
Topic starter  

毎度お世話になります。

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
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

str.Format(%I64u.%I64u, temp.QuadPart/1000,temp.QuadPart%1000);
でどうでしょう?


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

>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
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

>str.Format( ???, temp.QuadPart/1000);
これで良ければこれで十分です
str.Format(%I64u,temp.QuadPart/1000);

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

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


返信引用
にし
 にし
(@にし)
ゲスト
結合: 23年前
投稿: 22
Topic starter  

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
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

> wk = (int)(temp.QuadPart%(1000/1000/1000))
wk = (int)(temp.QuadPart%(1000*1000*1000))
では?


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

>商と剰余を別々に計算して、文字列で結合する方法でこれで実現可能かと思いますが、
>ただ、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
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

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

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

すみません
>よって10ビット右シフトで対応できそうですね
シフトじゃ小数以下でませんね(汗)


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

普通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バイトを超えるとダメですが。


返信引用
にし
 にし
(@にし)
ゲスト
結合: 23年前
投稿: 22
Topic starter  

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
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

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


返信引用
にし
 にし
(@にし)
ゲスト
結合: 23年前
投稿: 22
Topic starter  

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

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

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


返信引用
にし
 にし
(@にし)
ゲスト
結合: 23年前
投稿: 22
Topic starter  

>単位をギガバイトにしただけですよ。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました