2010-03-07 56 views
18
  • 现在不是最大的整数类型了,现在有很长的时间了。
  • 它不是一个固定宽度类型:它在某些平台上是32位,在其他平台上是64位。
  • 这并不一定大小的指针相同(例如,在64位Windows)

所以,做“长”有任何意义了吗?是否有理由宣布一个长而不是ptrdiff_t或int64_t?“长”在C中仍然有用吗?

回答

5

still usefulsomething you should habitually use之间存在细微的差异。 long类型仍然兴旺,因为Chris Lutz noted落后于许多系统和平台特定类型(尽管通常为无符号)。

当你知道你将总是要适应这种类型的(愉快,更好,如果你还知道的符号性)来处理的数据,也没有特别的理由使用它,特别是如果你在一个结构中有足够的空间来处理。

但是,在大多数情况下,为了未来的维护者,尽可能使用intxx_t或uintxx_t更好。例如,你不知道不知道知道一个UNIX纪元日期将永远适合在32位平台上的无符号长整型内(因此,time_t),除非你有充分的权限让世界在它滚动之前结束:)

+4

好的,提示2012年的笑话... – 2010-03-08 00:53:39

+2

我会争辩说,除非你有一个特定的理由需要*精确* XX位,你不应该使用'intXX_t'。通常你至少需要* XX位,在这种情况下,你可以简单地使用int来表示X <= 16; '长'为16 caf 2010-03-08 06:10:41

+1

@caf:无法与此争论。然而,我写的很多代码都是这样写的,即某个成员永远不会比'某种类型更大“,事实上,所有的事情都比我实际计划的要小得多。通常情况下,当你不得不保持查询结果时,将其他事情捣毁的东西列表列表等等。我认为我比防守效率更高,但是我有时候大多数时候都没有选择:) – 2010-03-08 07:45:03

17

是否有任何理由声明长而不是ptrdiff_t或int64_t?

从来没有在这种情况下。如果您需要指针差异或特定的64位值,则应该使用ptrdiff_tint64_t。首先,您应该永远不会使用long,除了可能在平台相关的typedef之后。

当您至少需要32位整数时,您应该使用long,因为int只能保证至少为16位。如果您需要本地类型,但至少需要32位,请使用long。如果16位限制在某些旧平台上可以接受(这可能无关紧要,并且您的代码可能不会永久编译),那么它并不重要。

+1

+1为至少一定大小的整数想法。 – 2010-03-07 22:36:47

+4

我应该注意的是,C99的'int_leastX_t'类型也可以满足这个要求,但由于很少有编译器支持C99,因此不太可靠。 – 2010-03-07 22:41:44