另外准确性

时间:2011-02-11 11:26:13

标签: c++ c addition

我正在使用C中的工具来计算一些传入/传出位,我想保留这些位,而不是通过更改为字节来丢失它们。

最后我想显示下载/上传的xxxxx位。我将最大值放在10GB = 85899345920bits上,需要大约35位来表示。我使用的是32位操作系统。 我尝试了unsigned long和unsigned int但是它们重载了。

任何简单的方法来获得加法过程并保持准确性?

4 个答案:

答案 0 :(得分:5)

您可以采取一些混合方法:将字节的数量存储到一个变量中,并将的数量存储到另一个变量中。类似于POSIX系统在时间微秒内返回自纪元以来的时间:

       struct timeval {
           time_t      tv_sec;     /* seconds */
           suseconds_t tv_usec;    /* microseconds */
       };

当您转移1505位时,请存储:

bytes += (1505/8); // ==188
bits += (1505%8); // ==1

这样你可以跟踪比特。

或者您可以从中获取所有乐趣并使用long long

答案 1 :(得分:2)

如果您使用的是MSVC,则可以使用__int64或LONGLONG。

其他人可能支持它或等同物。

如果没有,我认为你应该使用Joe的答案,但是在必要时,只需将额外的0到7位存储在单独的char或int中。任何其他附加位应进入该存储区,当它“溢出”(即8位或更多位)时,只需取走8位,但在字节数上加1。

编辑: 很久了?

答案 2 :(得分:1)

如果假设一个字节中有8位(在许多情况下这是一个安全的假设!)那么您可以只存储字节数,并在显示时将其乘以8。您的软件可能一次处理至少一个字节的缓冲区。

答案 3 :(得分:1)

uint64_t(来自<stdint.h>)会给你64位。 (对于特定的编译器和操作系统,这与unsigned long long相同,但最好使用固定宽度类型,例如uint64_t