【问题标题】:manipulating LARGE_INTEGERS操纵 LARGE_INTEGERS
【发布时间】:2009-09-08 17:54:06
【问题描述】:

我在 Win32 下的 MS dev studio 中将一些代码从 C 转换为 C++。在旧代码中,我使用 QueryPerformanceCounter() 进行了一些高速计时,并对获得的 __int64 值进行了一些操作,特别是减号和除号。但是现在在 C++ 下,我不得不使用 LARGE_INTEGER,因为这是 QueryPerformanceCounter() 返回的。但是现在在我尝试对值做一些简单的数学运算时,我得到了一个错误:

错误 C2676:二进制“-”:“LARGE_INTEGER”未定义此运算符或转换为预定义运算符可接受的类型

我尝试将变量转换为 __int64 但随后得到:

错误 C2440:“类型转换”:无法从“LARGE_INTEGER”转换为“__int64”

我该如何解决这个问题?

谢谢,

【问题讨论】:

    标签: c++ int64


    【解决方案1】:

    LARGE_INTEGER 是一个 64 位整数和一对 32 位整数的并集。如果要对其中一个执行 64 位算术运算,则需要从 union 内部选择 64 位 int。

    LARGE_INTEGER a = { 0 };
    LARGE_INTEGER b = { 0 };
    
    __int64 c = a.QuadPart - b.QuadPart;
    

    【讨论】:

    • 你怎么能有 2 个 LARGE_INTEGER?通常(问题中的链接)您只有一个作为输入,并希望将其转换为 long long 或任何内容。
    • @Sandburg LARGE_INTEGER 频率;频率.QuadPart = 0; QueryPerformanceFrequency(&frequency); Do_Something_Worth_Timing();查询性能计数器(&t2); TRACE("花了 %f 秒!\n", (float)(t2.QuadPart - t1.QuadPart) / (float)frequency.QuadPart );大整数 t1, t2;查询性能计数器(&t1); // 假设 (float) 足够精确...
    【解决方案2】:

    LARGE_INTEGER 是一个联合,documented here。你可能想要一个QuadPart 成员。

    【讨论】:

      【解决方案3】:

      这里是:

      LARGE_INTEGER x,y;
      ///
      //Some codes...
      ///
      
      __int64 diff = x.QuadPart - y.QuadPart
      

      因为 QuadPart 被定义为 LONGLONG ,与 __int64 相同。

      【讨论】:

        【解决方案4】:

        LARGE_INTEGER 是一个联合,如果你想处理 64 位值,你仍然可以使用 .QuadPart。

        【讨论】:

          【解决方案5】:

          正如Documentation备注部分所说:

          LARGE_INTEGER 结构实际上是一个联合。如果您的编译器具有对 64 位整数的内置支持,请使用 QuadPart 成员来存储 64 位整数。否则,使用 LowPart 和 HighPart 成员来存储 64 位整数。

          因此,如果您的编译器支持 64 位整数,请像这样使用 quadPart:

          LARGE_INTEGER a, b;
          __int64 diff = a.QuadPart - b.QuadPart
          

          【讨论】:

            【解决方案6】:

            除了答案之外,如果您希望构造一个非零值的 LARGE_INTEGER,您可以分别分配低和高部分。 LowPart 首先在联合中定义,唯一的 highPart 是有符号的。

            LARGE_INTEGER li = {0x01234567, -1};
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-12-04
              • 2013-03-25
              • 2022-01-18
              • 2013-05-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多