2011-02-11 76 views
0

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

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

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

+0

你使用什么编译器?所有主要编译器都支持64位算术运算,即使在32位体系结构上也是如此。 – TonyK 2011-02-11 11:29:45

+0

@Tony:即时通讯使用gcc 4.x – 2011-02-11 11:35:23

回答

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

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

+0

或者只是使用`CHAR_BIT`。 – GManNickG 2011-02-11 11:33:17

+0

@ Joe,GMan:不是我真的想要精确到位级别。字节的方法是不准确的 – 2011-02-11 11:37:18

2

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

它或其等同物可以在其他方面得到支持。

如果不是,我认为你应该与乔的答案一起去,但是在必要时,只需将额外的0到7位存储在单独的char或int中。任何其他附加位应该进入该存储区,并且当它“溢出”(即8位或更多)时,只需将8位移走,但在字节计数中加1。

编辑: long long?

1

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