C++ 准确度
我正在用C编写一个工具来计算一些传入/传出的位,我希望保留这些位,而不是因为更改为字节而丢失它们 最后,我想显示下载/上传的xxxxx位。我将最大值设置为10GB=85899345920bit,它需要大约35位来表示。我使用的是32位操作系统。 我尝试了unsigned long和unsigned int,但它们重载了C++ 准确度,c++,c,addition,C++,C,Addition,我正在用C编写一个工具来计算一些传入/传出的位,我希望保留这些位,而不是因为更改为字节而丢失它们 最后,我想显示下载/上传的xxxxx位。我将最大值设置为10GB=85899345920bit,它需要大约35位来表示。我使用的是32位操作系统。 我尝试了unsigned long和unsigned int,但它们重载了 有什么简单的方法可以得到加法过程并保持准确性吗?如果你假设一个字节中有8位(在许多情况下这是一个安全的假设!),那么你只需存储字节数,并在显示时将其乘以8即可。您的软件可能一次处
有什么简单的方法可以得到加法过程并保持准确性吗?如果你假设一个字节中有8位(在许多情况下这是一个安全的假设!),那么你只需存储字节数,并在显示时将其乘以8即可。您的软件可能一次处理至少一个字节的缓冲区。如果您使用的是MSVC,您可以使用u int64或LONGLONG 其他方面可能会支持它或其等价物 如果没有,我想你应该按照Joe的答案去做,但是在必要的时候,只需将额外的0到7位存储在一个单独的char或int中。任何其他额外的位都应该存储在该存储中,当它“溢出”(即8位或更多)时,只需去掉8位,但在字节计数中添加1 编辑:
long long?您可以采用一种混合方法:将字节数存储到一个变量中,将多余的位数存储到另一个变量中。与POSIX系统以秒和微秒为单位返回自历元以来的时间的方式类似:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
当您获得1505
位的传输时,存储:
bytes += (1505/8); // ==188
bits += (1505%8); // ==1
这样,您可以跟踪位
或者你也可以把所有的乐趣都从它身上拿走,使用一个。uint64\u t(来自
)将为你提供64位。(对于特定的编译器和操作系统,这与unsigned long long
相同,但最好使用固定宽度类型,例如uint64\u t
。您使用的编译器是什么?所有主要的编译器都支持64位算术,即使在32位体系结构上也是如此。@Joe,GMan:不太支持,我希望精度达到位级别。字节方法不可用accuracte@GMan:如果我有9位,并希望将它们表示为字节,那么它将是1或2字节(8或16),我不知道有多少exactly@Syntax:你得到的是未加工的碎片?这极不寻常。这些位是如何/在哪里发送的?@Syntax\u Error“至少64位”。我必须爱C,有时很难把事情弄清楚:)我认为它将依赖于平台,但几乎所有东西都是64。有时可能是128,但我不认为它会小到32。我想这可能是一份见好就收的工作!如果你是那种信任维基百科的人,那么本页有一个关于“特定C语言数据模型”的章节: