我正在使用C中的工具来计算一些传入/传出位,我想保留这些位,而不是通过更改为字节来丢失它们。
最后我想显示下载/上传的xxxxx位。我将最大值放在10GB = 85899345920bits上,需要大约35位来表示。我使用的是32位操作系统。 我尝试了unsigned long和unsigned int但是它们重载了。
任何简单的方法来获得加法过程并保持准确性?
答案 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
。