【问题标题】:C: long long always 64 bit?C:long long总是64位?
【发布时间】:2011-03-08 00:38:02
【问题描述】:

如果我在我的代码中使用 long long,我可以绝对 100% 保证无论代码在哪台机器上运行它们都将具有 64 位吗?

【问题讨论】:

标签: c


【解决方案1】:

不,C99 标准规定它将具有至少 64 位。所以我猜在某些时候它可能不止于此。如果您需要 64 位,则可以使用 int64_t 类型,始终假设您有 stdint.h 可用(C99 中的标准)。

#include <stdint.h>
int64_t your_i64;

【讨论】:

  • 如果实现具有符合其要求的类型,则必须提供 int64_t - 但(至少理论上)可能不存在此类类型,在这种情况下 int64_t 不会已定义。
  • int_least64_t 必须由 C99 实现提供;这保证了 64 位或更多位
  • @pmg long long 也保证至少 64位。这就是问题所在。 :-)
【解决方案2】:

您可以使用此测试您的编译器是否符合预处理器中的数字的 C99

# if (~0U < 18446744073709551615U)
#  error "this should be a large positive value, at least ULLONG_MAX >= 2^{64} - 1"
# endif

这是可行的,因为所有无符号值(在预处理器中)都必须与uintmax_t 的类型相同,因此0U 的类型为uintmax_t~0U0U-1-1U 都是最大可表示数。

如果此测试有效,unsigned long long 实际上是 uintmax_t 的可能性很高。

对于预处理阶段之后的有效表达式,用真实类型进行测试

unsigned long long has_ullong_max[-1 + 2*((0ULL - 1) >= 18446744073709551615ULL)];

这使用了相同的技巧,但使用后缀 ULL 来确保具有 unsigned long long 类型的常量。

【讨论】:

    【解决方案3】:

    保证它们至少为 64 位。从理论上讲,它们可能会更大(例如,128 位),尽管我有理由认为它们在当前可用的任何东西上只有 64 位。

    【讨论】:

    • 在 llp64 内存模型编译器上,如果 long long int 提高到 128 位会很方便。
    • 如果没有具有非两倍大小字的 DSP 可用并且 DSP 通常具有 C 编译器,我会感到惊讶。然后历史机器比通常更活跃一点(不多):PDP-10(36位处理器,它在网络上的某个地方有一个gcc端口,我认为它使用了72位长)仍然用作嵌入式上次我查看了一些网络硬件中的处理器,Unisys 仍在销售 36 位和 48 位机器——我不知道他们是否有 C 编译器。
    • @AProgrammer:我相信 Unisys 有一个 C 编译器,但至少在我上次查看时,它只是试图符合 C90 而不是 C99,所以我完全不确定它有多久- 很长。我想我的措辞是模棱两可的:虽然 gcc 肯定是可用的,但 PDP-10 已经有一段时间没有了。
    • @Jerry,如果我不清楚,我会关心的实际案例是 DSP,而不是 PDP-10(XKL 在 1997 年仍然出售它们,我认为他们仍在内部使用它们)也不是 Unisys 机器。
    • @AProgrammer:我对 DSP 不太确定。例如,AD SigmaDSP 是 28/56 位处理器,因此对它们来说显而易见的选择是 112 位 long long,但至少我上次使用它们时,它们没有提供。 TigerSHARC 使用 64 位 long long。我相信 TI C5000 和 C6000 也使用 64 位长。还有其他供应商,但是...
    【解决方案4】:

    #if CHAR_BIT * sizeof (long long) != 64
       #pragma error "long long is not 64 bits"
    #endif
    

    或类似的东西。

    基于评论:如果您想支持在预处理器中无法使用 sizeof 的编译器,请参阅此线程:

    http://www.daniweb.com/forums/thread13553.html

    类似这样的:

     char longlongcheck[(sizeof(long long) * CHAR_BIT) == 64]; // won't compile if the expression is 0.
    

    【讨论】:

    • 你不能在预处理器表达式中使用sizeof(官方无论如何——一些编译器允许它,但它是一个扩展)。
    • 对于那些编译器来说,如果数组不匹配,则创建一个大小非法的数组是有技巧的。会找到并发布。
    • 带有sizeof 的技巧很遗憾不能保证在带有填充位的奇异机器上工作。对于不依赖于此的变体,请参阅我的答案。
    • 嗯,#if LLONG_MIN != -0x7FFFFFFFFFFFFFFF-1 是一种简单易行的方法(这也会同时检查二进制补码,如果您关心位数,您几乎肯定要确保这一点)。
    猜你喜欢
    • 2013-08-01
    • 1970-01-01
    • 2023-04-07
    • 2010-09-27
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多