【问题标题】:Accuracy in addition另外的准确性
【发布时间】:2011-02-11 11:26:13
【问题描述】:

我正在用 C 语言开发一个工具来计算一些传入/传出的位,我想保留这些位而不是通过更改为字节来丢失它们。

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

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

【问题讨论】:

  • 你用的是什么编译器?所有主要编译器都支持 64 位算术,即使在 32 位架构上也是如此。

标签: c++ c addition


【解决方案1】:

您可以采取一些混合方法:将 bytes 的数量存储到一个变量中,将额外的 bits 数量存储到另一个变量中。类似于 POSIX 系统如何以秒微秒返回自纪元以来的时间:

       struct timeval {
           time_t      tv_sec;     /* seconds */
           suseconds_t tv_usec;    /* microseconds */
       };

当您获得1505 位的传输时,存储:

bytes += (1505/8); // ==188
bits += (1505%8); // ==1

这样你可以跟踪比特。

或者你也可以使用long long

【讨论】:

  • @Syntax_Error "至少 64 位"。一定要爱 C,有时很难确定事情 :)
【解决方案2】:

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

其他人可能支持它或等效项。

如果不是,我认为您应该选择 Joe 的答案,但如有必要,只需将额外的 0 到 7 位存储在单独的 char 或 int 中。任何其他额外的位都应该进入该存储,当它“溢出”时(即 8 位或更多位),只需带走 8 位,但将字节数加 1。

编辑: 长长?

【讨论】:

  • 我认为它会依赖于平台,但几乎所有东西都会是 64。有时可能是 128,但我认为它永远不会像 32 一样小。我认为它可能做一个吸了就看的工作!
  • 如果你是那种信任 Wikipedia 的人,这个页面上有一个关于“特定 C 语言数据模型”的部分:en.wikipedia.org/wiki/64-bit
【解决方案3】:

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

【讨论】:

  • @Joe,GMan:我不是真的想要将精度提高到位级别。字节方法不准确
  • @GMan:如果我有 9 位并且想将它们表示为字节,那将是 1 或 2 个字节(8 或 16)我不知道到底有多少
  • @Syntax:你得到的是原始数据?这非常不寻常。
  • 这些位是如何/在哪里发送的?
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 2016-06-03
    • 2019-10-09
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多