将无符号长-长除法

Dividing unsigned long long

本文关键字:除法 无符号      更新时间:2023-10-16

当前正在尝试用静态值除无符号长整型。

无符号长-长包含完成操作所需的微秒数。我想取这个值并将其转换为秒。

这是代码狙击坑:

double udDiffTime = ullHighResDiffTime / (unsigned long long)1000000;

在我的调试器的一个例子中,我可以看到ullHighResDiffTime=639。因此,udDiffTime=0.000639。但是,我得到udDiffTime=0。

我确信我在某个地方犯了一个错误。我尝试过使用1000000LL,而不是使用(unsigned long-long)进行强制转换,但没有区别。

您正在进行整数除法,因此,如果结果为0.000639,它将被截断为0。

如果想要浮点结果,则必须至少使用一个浮点操作数。例如,尝试将(unsigned long long) 1000000更改为1000000.0

无符号长-长的范围最长可达18446744073709551615。double可以达到1.7E308(即具有308个零的1)。问题是,值越高,精度就越低,所以你需要问问自己,大值是否真的需要那么精确,或者数字的大小是否更重要。

将其更改为

double udDiffTime = ullHighResDiffTime / 1000000.0;

以获得您期望的结果。

如果ullHighResDiffTime的类型是无符号长,则将整数除以一个不会调用浮点运算的整数。

使用这个替代:

double udDiffTime = ullHighResDiffTime / 1000000.0;

unsigned long long是一个积分类型,因此使用积分除法。只有在除法之后,该值才被转换为double。尝试除以1000000.0

用相同类型对无符号long-long(或任何整数)进行除法运算会得到相同的类型。然后将该值转换为双精度,但结果已经为零。

用替身把它分开。