0

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

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

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

4

4 回答 4

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.

于 2011-02-11T11:48:19.880 回答
2

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

它或等价物可能在其他人中得到支持。

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

编辑:长长?

于 2011-02-11T11:39:18.497 回答
1

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

于 2011-02-11T11:32:01.140 回答
1

uint64_t(from <stdint.h>) 将为您提供 64 位。(对于您特定的编译器和操作系统,这与 相同unsigned long long,但最好使用固定宽度类型,例如uint64_t用于此)。

于 2011-02-11T11:57:07.233 回答