我正在使用 C 中的一个工具来计算一些传入/传出位,我想保留这些位而不是通过更改为字节来丢失它们。
最后我想显示下载/上传的 xxxxx 位。我将最大值放在 10GB=85899345920bits 上,大约需要 35 位来表示。我使用的是 32 位操作系统。我尝试了 unsigned long 和 unsigned int 但它们超载了。
任何简单的方法来获得加法过程并保持准确性?
您可以采取一些混合方法:将字节数存储到一个变量中,将额外的位数存储到另一个变量中。类似于 POSIX 系统如何以秒和微秒返回自纪元以来的时间:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
当你得到1505
比特传输时,存储:
bytes += (1505/8); // ==188
bits += (1505%8); // ==1
这样您就可以跟踪位。
或者您可以从中获得所有乐趣并使用long long
.
如果您使用 MSVC,则可以使用 __int64 或 LONGLONG。
它或等价物可能在其他人中得到支持。
如果不是,我认为您应该选择 Joe 的答案,但如有必要,只需将额外的 0 到 7 位存储在单独的 char 或 int 中。任何其他额外的位都应该进入该存储,当它“溢出”(即 8 位或更多)时,只需带走 8 位,但在您的字节数上加 1。
编辑:长长?
如果您假设一个字节中有 8 位(在许多情况下这是一个安全的假设!),那么您可以只存储字节数,并在显示时将其乘以 8。您的软件可能一次处理至少一个字节的缓冲区。
uint64_t
(from <stdint.h>
) 将为您提供 64 位。(对于您特定的编译器和操作系统,这与 相同unsigned long long
,但最好使用固定宽度类型,例如uint64_t
用于此)。