【发布时间】:2010-03-07 22:29:51
【问题描述】:
- 现在有了“long long”,它不再是最大的整数类型了。
- 它不是固定宽度类型:在某些平台上是 32 位,在其他平台上是 64 位。
- 不一定与指针大小相同(例如,在 64 位 Windows 上)
那么,“长”还有意义吗?是否有理由声明 long 而不是 ptrdiff_t 或 int64_t?
【问题讨论】:
标签: c
那么,“长”还有意义吗?是否有理由声明 long 而不是 ptrdiff_t 或 int64_t?
【问题讨论】:
标签: c
是否有理由声明 long 而不是 ptrdiff_t 或 int64_t?
在那些情况下从来没有。如果你想要一个指针差异,或者一个特定的 64 位值,你应该使用 ptrdiff_t 或 int64_t。你一开始就不应该使用long,除非可能在依赖于平台的typedef之后。
当您需要至少一个 32 位整数时,您应该使用long,因为int 只能保证至少为 16 位。如果您需要本机类型,但至少需要 32 位,请使用 long。如果 16 位限制在某些旧平台上是可以接受的(这可能无关紧要,而且您的代码可能永远不会被编译),那么这并不特别重要。
【讨论】:
int_leastX_t 类型也可以满足该要求,但由于很少有编译器支持 C99,因此可靠性较低。
still useful 和 something you should habitually use 之间存在细微差别。 long 类型仍然蓬勃发展,因为 Chris Lutz noted 落后于许多系统和平台特定类型(尽管通常是无符号的)。
当您知道您将使用的数据总是适合该类型时(当然,如果您也知道签名会更好),就没有不使用它的特殊原因,尤其是当您在结构中的空间有限时。
但是,在大多数情况下,为了未来的维护者,尽可能使用 intxx_t 或 uintxx_t 会更好。例如,您不知道 UNIX 纪元日期总是适合 32 位平台上的无符号长整数(因此是 time_t),除非您拥有世界将在此之前结束的权威它翻了:)
【讨论】:
intXX_t。通常您确实需要至少 XX 位,在这种情况下,您可以简单地使用int for X long 对于 16 long long 表示 32 time_t。 (需要完全 XX 位的最常见原因是处理磁盘或在线格式)。