"长"在C中仍然有用吗?

dan*_*n04 18 c

  • 现在已经不再是最大的整数类型,而是"漫长的".
  • 它不是固定宽度类型:在某些平台上为32位,在其他平台上为64位.
  • 它不一定与指针大小相同(例如,在64位Windows上)

那么,"长"是否有任何意义?是否有理由声明long而不是ptrdiff_t或int64_t?

Chr*_*utz 17

是否有理由声明long而不是ptrdiff_t或int64_t?

在那些情况下从来没有.如果你想要一个指针差异,或一个特定的64位值,你应该使用ptrdiff_tint64_t.你应该永远不会long在第一时间使用,除非可能依赖于平台typedef.

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

  • 我应该注意,C99的`int_leastX_t`类型也可以满足该要求,但由于很少有编译器支持C99,因此不太可靠. (4认同)

Tim*_*ost 5

still useful和之间有一个微妙的区别something you should habitually use.这种long类型仍然蓬勃发展,正如Chris Lutz在许多系统和平台特定类型背后所说的那样(尽管通常是无符号的).

当你知道你将要使用的数据总是适合那种类型(同样,如果你也知道签名就更好),没有特别的理由使用它,特别是如果你在结构中的空间有限与...合作.

但是,在大多数情况下,为了将来的维护者,尽可能使用intxx_t或uintxx_t要好得多.例如,您知道UNIX纪元日期总是适合32位平台上的无符号长整数(因此,time_t),除非您拥有良好的权限,世界将在其翻身之前结束:)

  • 我认为,除非你有一个特定的理由需要*正好*XX位,否则你不应该使用`intXX_t`.通常你真的需要*至少*XX位,在这种情况下你可以简单地使用`int`来表示X <= 16; `long`为16 <X <= 32; 并且`long long`为32 <X <= 64.在UNIX纪元的情况下,你应该使用`time_t`.(需要*完全*XX位的最常见原因是处理磁盘或线上格式). (2认同)