Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 准确度_C++_C_Addition - Fatal编程技术网

C++ 准确度

C++ 准确度,c++,c,addition,C++,C,Addition,我正在用C编写一个工具来计算一些传入/传出的位,我希望保留这些位,而不是因为更改为字节而丢失它们 最后,我想显示下载/上传的xxxxx位。我将最大值设置为10GB=85899345920bit,它需要大约35位来表示。我使用的是32位操作系统。 我尝试了unsigned long和unsigned int,但它们重载了 有什么简单的方法可以得到加法过程并保持准确性吗?如果你假设一个字节中有8位(在许多情况下这是一个安全的假设!),那么你只需存储字节数,并在显示时将其乘以8即可。您的软件可能一次处

我正在用C编写一个工具来计算一些传入/传出的位,我希望保留这些位,而不是因为更改为字节而丢失它们

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


有什么简单的方法可以得到加法过程并保持准确性吗?

如果你假设一个字节中有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语言数据模型”的章节: