C++ 有人能解释为什么这两种转换为无符号long-long的结果不同吗?

C++ 有人能解释为什么这两种转换为无符号long-long的结果不同吗?,c++,c,windows,winapi,C++,C,Windows,Winapi,(Count.QuadPart是显示CPU计数的长字符) (Freq.QuadPart是一个长字符,显示每秒的计数频率) 正在尝试实时打印微秒 稳定输出: LARGE_INTEGER lpPerformanceCount, lpFrequency; QueryPerformanceCounter(&lpPerformanceCount); QueryPerformanceFrequency(&lpFrequency); 输出不稳定:(结果前后不连贯地跳跃,即使乍一看是正常的)

(Count.QuadPart是显示CPU计数的长字符)

(Freq.QuadPart是一个长字符,显示每秒的计数频率)

正在尝试实时打印微秒

稳定输出:

LARGE_INTEGER lpPerformanceCount, lpFrequency;

QueryPerformanceCounter(&lpPerformanceCount);
QueryPerformanceFrequency(&lpFrequency);
输出不稳定:(结果前后不连贯地跳跃,即使乍一看是正常的)


编辑:printf需要在其输入中进行进一步的(无符号长-长)转换,原始代码通过func的返回值进行了转换。

您确定
%llu
打印出合理的双精度吗

lpPerformanceCount.QuadPart/lpFrequency.QuadPart
提供一个时间,四舍五入到整秒

lpPerformanceCount.QuadPart%lpFrequency.QuadPart
提供刻度计数(自上一整秒以来的刻度数)

给时间加上一个计数会给你带来。。如何礼貌地说。。。废话

我总是使用双重算术,更少的麻烦。但是,如果您坚持使用非FPU代码,您可以使用:

printf("%llu\n", 1000000 * (lpPerformanceCount.QuadPart / lpFrequency.QuadPart) + (lpPerformanceCount.QuadPart % lpFrequency.QuadPart));
这将更快地溢出(尽管我认为这不是一个实际问题)。修正整数算术的问题:

count.QuadPart*1000000 / (freq.QuadPart*1000000)

(我希望那是对的……)

是的。IIUC,应该是这样的:

count.QuadPart / freq.QuadPart 
+ (count.QuadPart % freq.QuadPart) * 1000000 / freq.QuadPart
或许

1000000 * (lpPerformanceCount.QuadPart / lpFrequency.QuadPart) + 
(lpPerformanceCount.QuadPart % lpFrequency.QuadPart) * 1000000 / lpFrequency.QuadPart

如果
lpFreuency.QuadPart
高,则第一个将溢出;如果
lpFrequency.QuadPart
值较低,则第二个值将不准确,甚至溢出。

您认为将它们转换为该值最安全的方法是什么?无符号长变量=((长双精度)lpPerformanceCount.QuadPart/lpFrequency.QuadPart)*1000000)是最好的吗?(或使用10000000ull)我将
1.0/freq.QuadPart
存储为每个刻度的时间,并使用
count.QuadPart*timePerTick
存储一段时间(以秒为单位)。理论上会有精度损失,但我从未见过会受到影响的频率值。我想这对于硬件来说几乎是等效的,因为浮点运算开始发挥作用。谢谢你的意见。
1000000 * (lpPerformanceCount.QuadPart / lpFrequency.QuadPart) + 
(lpPerformanceCount.QuadPart % lpFrequency.QuadPart) * 1000000 / lpFrequency.QuadPart
(lpPerformanceCount.QuadPart / (lpFrequency.QuadPart / 1000000) )