【问题标题】:type unsigned long long int is it enough for 1 - 10^9 range?输入 unsigned long long int 是否足以满足 1 - 10^9 的范围?
【发布时间】:2018-04-04 14:24:55
【问题描述】:

Consigne:每个整数都在 1 - 109 的范围内。

我使用unsigned long long int类型的变量

对于规定的范围是否足够?

【问题讨论】:

  • 它依赖于平台。使用stdint.huint64_t(注意uint32_t 对于这样的范围就足够了)
  • 1e10 超出 32 位范围,是的。
  • @Jean-FrançoisFabre:但你在这里当然是正确的。我会停止拖钓你的 cmets ;-)
  • 不,不要使用 uint64_t,除非您需要 64 位 且仅此而已的类型。 uint_least64_t 更便携(至少理论上如此)。
  • “每个整数”是什么意思?您的程序将读取并存储在对象中的每个整数?或者您的程序是否会对这些值进行各种算术运算,这样,尽管输入值被限制为 10^9,但需要更多位来适应将对它们执行的算术运算?

标签: c types


【解决方案1】:

10^9 远小于 2^32

因此,在您的情况下,无需使用 unsigned long long(它适合,是的),这太过分了,可能会导致操作速度变慢。

使用正确的类型,在stdint.h 中标准化包括:uint32_tuint_least32_t (uint32_t vs uint_fast32_t vs uint_least32_t)

long 也保证为at least 32 bits,所以它也是一个不错且简单的选择。

【讨论】:

  • 首选uint_least32_t(或uint_fast32_t)用于可移植代码。
  • uint_fast32_t 是个坏主意。它在包括 glibc/x86_64 在内的许多实际实现中被错误定义,既浪费内存又损害性能。使用uint_least32_t 或仅使用unsigned long 甚至long
  • 你是对的,long 很简单,至少是 32 位的。为什么要使用规范化类型?
【解决方案2】:

是的(假设您采用符号 10^9 表示 1e9 - ^ 是 C 中的 XOR 运算符,10^93)。

unsigned long long 必须能够存储 0 到 2 之间的数字64 - 1。您的最大值远小于此值。

另请注意,unsigned long 必须能够存储 0 到 2 之间的数字32 - 1。您的最大值也小于此值。

【讨论】:

  • 甚至signed long 都能够存储超过1e9 的数字。
【解决方案3】:

Long long 无符号整数类型。至少包含 [0, +18,446,744,073,709,551,615] 范围; 从标准的 C99 版本开始指定。

来源:https://en.m.wikipedia.org/wiki/C_data_types

【讨论】:

  • 如页面所述:这适用于 C99。在此之前,规则类似于 16 位
  • 我不确定,但如果我错了,请纠正我。在 C99 之前,long long 类型确实存在吗?还是只是gcc 扩展?
【解决方案4】:

答案是肯定的,但你不需要unsigned long longunsigned long 就足够了。

一个 32 位的数字可以表示超过 4 * 10^9。最多 4 294 967 296。

【讨论】:

  • 10^10 大于 2^32。
猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 2012-01-27
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 2021-05-07
相关资源
最近更新 更多