【发布时间】:2011-03-08 00:38:02
【问题描述】:
如果我在我的代码中使用 long long,我可以绝对 100% 保证无论代码在哪台机器上运行它们都将具有 64 位吗?
【问题讨论】:
标签: c
如果我在我的代码中使用 long long,我可以绝对 100% 保证无论代码在哪台机器上运行它们都将具有 64 位吗?
【问题讨论】:
标签: c
不,C99 标准规定它将具有至少 64 位。所以我猜在某些时候它可能不止于此。如果您需要 64 位,则可以使用 int64_t 类型,始终假设您有 stdint.h 可用(C99 中的标准)。
#include <stdint.h>
int64_t your_i64;
【讨论】:
int64_t - 但(至少理论上)可能不存在此类类型,在这种情况下 int64_t 不会已定义。
int_least64_t 必须由 C99 实现提供;这保证了 64 位或更多位
您可以使用此测试您的编译器是否符合预处理器中的数字的 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 和~0U,0U-1 和-1U 都是最大可表示数。
如果此测试有效,unsigned long long 实际上是 uintmax_t 的可能性很高。
对于预处理阶段之后的有效表达式,用真实类型进行测试
unsigned long long has_ullong_max[-1 + 2*((0ULL - 1) >= 18446744073709551615ULL)];
这使用了相同的技巧,但使用后缀 ULL 来确保具有 unsigned long long 类型的常量。
【讨论】:
保证它们至少为 64 位。从理论上讲,它们可能会更大(例如,128 位),尽管我有理由认为它们在当前可用的任何东西上只有 64 位。
【讨论】:
long long,但至少我上次使用它们时,它们没有提供。 TigerSHARC 使用 64 位 long long。我相信 TI C5000 和 C6000 也使用 64 位长。还有其他供应商,但是...
与
#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 是一种简单易行的方法(这也会同时检查二进制补码,如果您关心位数,您几乎肯定要确保这一点)。