5

http://msdn.microsoft.com/en-us/library/windows/desktop/aa383742%28v=vs.85%29.aspx

これらはこのように使用され、LowPartとHighPartに2つの32ビット値を設定してから、QuadPartで演算を実行することになっています。

int a,b,c;
ULARGE_INTEGER u;
...
u.LowPart = a;
u.HighPart = b;
u.QuadPart += c;

したがって、QuadPart(64ビット)で算術演算を実行する場合は、64ビットプロセッサが必要です。それで、全体のポイントは何ですか?QuadPartに直接値を割り当ててみませんか?

4

3 に答える 3

8

64 ビット データ型で算術演算を実行するのに 64 ビット プロセッサは必要ありません。私が知っているすべての 32 ビット コンパイラは、64 ビット整数の算術演算をサポートしています。ハードウェアがネイティブ演算を許可しない場合、コンパイラは演算を行うコードを生成する必要があります。通常、これはコンパイラの RTL のサポート関数を利用します。

この構造体は、64 ビット データ型のネイティブ サポートを提供しないコンパイラで使用するためのものです。あなたがリンクしたドキュメントそのものがそれを明確にしています:

C コンパイラは、64 ビット整数をネイティブにサポートしている場合があります。たとえば、Microsoft Visual C++ は__int64サイズの整数型をサポートしています。詳細については、C コンパイラに付属のドキュメントを参照してください。

ネイティブの 64 ビット整数をサポートしないコンパイラは、QUADPART共用体メンバーを整数として扱うことができません。

typedef union _ULARGE_INTEGER {
  struct {
    DWORD LowPart;
    DWORD HighPart;
  };
  struct {
    DWORD LowPart;
    DWORD HighPart;
  } u;
  ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;

そして の定義ULONGLONG:

#if !defined(_M_IX86)
 typedef unsigned __int64 ULONGLONG;
#else
 typedef double ULONGLONG;
#endif

もちろん、過去 10 年 (またはそれ以上) に作成されたすべてのコンパイラは、64 ビット整数をネイティブでサポートします。しかし、この共用体はもともとかなり前に導入されたものであり、コンパイラの状況は当時とは異なっていたでしょう。Windows ヘッダー ファイルを見るときは、常に歴史と遺産を念頭に置いてください。

于 2013-02-16T22:49:32.013 に答える
5

通常ULARGE_INTEGER、32 ビット整数のペアを 64 ビット整数に、またはその逆に変換する必要がある場合に使用されます。

たとえば、FILETIME構造を操作することを検討してください。

void add_millisecond(FILETIME * ft)
{
  ULARGE_INTEGER uli;
  uli.LowPart = ft->dwLowDateTime;
  uli.HighPart = ft->dwHighDateTime;
  uli.QuadPart += 10000;
  ft->dwLowDateTime = uli.LowPart;
  ft->dwHighDateTime = uli.HighPart;
}

QuadPart 値がないため、直接割り当てることはできません。あなたが持っているのは、高い部分と低い部分だけです。

于 2013-02-18T09:23:02.630 に答える
3

したがって、QuadPart(64ビット)で算術演算を実行する場合は、64ビットプロセッサが必要です。

いいえ。しかし、本当の問題は、64ビット整数型をサポートするコンパイラが必要かどうかということです。この場合、その答えもノーです。これらの関数の目的は次のとおりです。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa383711%28v=vs.85%29.aspx

于 2013-02-16T22:31:58.790 に答える