我正在使用C中的一个工具来计算一些传入/传出位,我想保留位而不是通过改变字节来丢失它们。另外的准确性
最后我想显示下载/上传的xxxxx位。我将10GB = 85899345920位上的最大值表示为需要大约35位。我正在使用32位操作系统。 我试过unsigned long和unsigned int,但它们重载。
任何简单的方法来获得加法过程并保持准确性?
我正在使用C中的一个工具来计算一些传入/传出位,我想保留位而不是通过改变字节来丢失它们。另外的准确性
最后我想显示下载/上传的xxxxx位。我将10GB = 85899345920位上的最大值表示为需要大约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
。
如果你假定一个字节中有8位(在很多情况下这是一个安全的假设!),那么你可以只存储字节数,当你显示它时乘以8。您的软件可能一次处理至少一个字节的缓冲区。
或者只是使用`CHAR_BIT`。 – GManNickG 2011-02-11 11:33:17
@ Joe,GMan:不是我真的想要精确到位级别。字节的方法是不准确的 – 2011-02-11 11:37:18
如果您使用的是MSVC,则可以使用__int64或LONGLONG。
它或其等同物可以在其他方面得到支持。
如果不是,我认为你应该与乔的答案一起去,但是在必要时,只需将额外的0到7位存储在单独的char或int中。任何其他附加位应该进入该存储区,并且当它“溢出”(即8位或更多)时,只需将8位移走,但在字节计数中加1。
编辑: long long?
uint64_t
(来自<stdint.h>
)会给你64位。 (对于您特定的编译器和操作系统,这与unsigned long long
相同,但最好使用固定宽度类型,例如uint64_t
)。
你使用什么编译器?所有主要编译器都支持64位算术运算,即使在32位体系结构上也是如此。 – TonyK 2011-02-11 11:29:45
@Tony:即时通讯使用gcc 4.x – 2011-02-11 11:35:23