【问题标题】:What is the proper data type to store a sum of microseconds in C在C中存储微秒总和的正确数据类型是什么
【发布时间】:2013-06-01 09:27:18
【问题描述】:

考虑到这个数字可能非常大,使用unsigned long 是否安全?

FWIW,我将 apache 日志中的所有微秒加起来,因此这个数字可能会变得非常大。

【问题讨论】:

  • 你只需要阅读数据类型。最后,您可以在 Wikipedia 上阅读它(尽管它不被认为是可靠的来源)。至少,有书籍或其他网站...
  • 很好的答案,谢谢大家!
  • @PeteDarrow 如果您找到满意的答案之一,请点击旁边的复选标记。

标签: c types


【解决方案1】:
unsigned long integer is the best option to store big size data.

【讨论】:

    【解决方案2】:

    您可以使用无符号长整数。大小为 0 到 4294967295 字节

    【讨论】:

      【解决方案3】:

      unistd.h 声明 useconds_t


      更新指的是问题的正文而不是其标题:

      使用time_t 计算秒数,然后使用useconds_t 以微秒为单位存储余数。这使您的资源 100% 可移植。


      更新 2

      我刚刚发现我最近的 Debian 声明 suseconds_tlong int

      【讨论】:

      • 我的 /usr/include/sys/types.h 文件中的注释: /* * 类型 useconds_t 是一个无符号整数类型,能够存储 * 值至少在 0 到 1,000,000 的范围内。 /typedef uint_t useconds_t; / 时间,以微秒为单位 */ 这可能不适用于 OP 想要的。
      • @jimmcnamara:当然!然而,它回答了标题所暗示的问题。
      【解决方案4】:

      32bit 肯定会太小,unsigned long long 似乎是正确的选择,保证至少是 64bit。或者在<inttypes.h>中使用unit64_t,理论上更便携。

      大约5亿年,应该够了。^_^

      【讨论】:

        【解决方案5】:

        视情况而定。如wikipedia 所述,unsigned long 保证至少为 32 位,但我想这可能取决于您的机器。使用 32 位,您可以表示大到 2^32 = 4294967296 的数字。4294967296 微秒是 4294 秒或超过 1 小时。

        您需要更多吗?如果这样做,请考虑使用保证为 64 位的unsigned long long,尽管它是 C99。否则,您总是可以将秒数单独存储在另一个变量中,例如 timeval 结构。

        【讨论】:

          【解决方案6】:

          使用标准 C 存储“非常大”的数字的最佳方法是unsigned long long int

          • unsigned long long int 类型对象的最大值
            ULLONG_MAX 18446744073709551615 // 264 - 1

          这是在 C99+ 标准中定义的。如果您愿意/想要超越 C 所能做的,还有其他扩展可供查看,首先想到的是 GNU MP Bignum library

          我认为您应该考虑的第三种选择是将其分解为微秒和秒,就像gettimeofday()timeeval 结构所做的那样。这样你就不必进入荒谬的数字。如果您想在几微秒内查看数据,您始终可以自己进行转换。

          【讨论】:

          • 我喜欢将其分解为微秒和秒的想法。谢谢!
          【解决方案7】:

          一个 32 位无符号整数将给您大约 1 小时 11 分钟,以微秒计:

          4,294.967295 seconds
          

          另一方面,一个 64 位无符号整数将给您超过 50 万年。

          【讨论】:

            【解决方案8】:

            鉴于您可以在 32 位平台上存储在 unsigned long 中的最大值约为 4G,因此这 4G 微秒转换为仅 71 分钟。

            在 64 位平台上(注意在 Windows 上 long 始终是 32 位,即使在 Windows 64 位上也是如此),那么您最多可以计算 4G 乘以 71 分钟的微秒数。这是巨大的:大约 5800 个世纪。

            回答:如果你的unsigned long是64位的,没关系。

            【讨论】:

            • longunsigned long 的大小真的与平台大小没有太大关系。您通常可以期望指针大小与 OS 体系结构相匹配(即 sizeof(void*) 在 32 位系统上为 4,在 64 位系统上为 8),但对于整数类型,所有赌注都没有。:即使是 8 和 16-位系统可以有 32 位整数。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-20
            • 2020-01-25
            • 2014-09-21
            • 2021-12-29
            • 2018-01-20
            • 2011-05-29
            • 2018-11-04
            相关资源
            最近更新 更多