C99是否总是要求提供`int64_t`类型?

时间:2019-02-27 22:47:45

标签: c 64-bit language-lawyer c99

C99标准是否要求合格的编译器定义(并且可用)64位int64_t?还是它是可选的,而恰好是所有流行的编译器都定义了它?我显然是在特别询问有关CPU无法直接在其上处理64位值的平台的问题,但问题是更普遍的

我无法真正从C data types Wikipedia page或从this answer到相关问题中解决这个问题。

4 个答案:

答案 0 :(得分:5)

  

C99标准是否要求符合标准的编译器具有64位   int64_t定义了(并且可用)?还是可选的,只是碰巧   由所有流行的编译器定义?

从某种意义上说,该类型是可选的,而在另一种意义上则有条件地是必需的。具体来说,C99 says

  

typedef名称intN_t指定宽度为N的带符号整数类型   ,无填充位和二进制补码表示。 [...]

     

这些类型是可选的。但是,如果实现提供   宽度为8、16、32或64位,无填充位的整数类型,   和(对于带符号的类型)具有二进制补码   表示形式,它应定义相应的typedef名称。

因此,int64_t是可选的,因为不需要一致性实现即可提供与int64_t的特征完全匹配的任何类型,如果没有,则不需要。 t(实际上,根据另一部分,一定不能)提供类型int64_t

C99确实指定了类型为long long int的类型,其必需的最小范围要求表示的宽度至少为64位。现在有可能在某些实现中没有精确的带符号整数类型 64位宽(例如,int是24位,long 48和{{1 }} 96),并且可能存在64位值的整数类型,但它包含填充位或未用二进制补码表示。这样的实现可能完全符合要求,但尚未定义long long。不过实际上,目前尚没有任何此类通用实现。

答案 1 :(得分:2)

  

C99标准是否要求符合标准的编译器定义(并且可用)64位int64_t?

否,但C99要求long long至少为 64位。

此外,int64_t非常普遍。如果没有int64_t,几乎不可能在所有平台上都遇到合格的C99,因为它是必需的

  

C11dr 7.20.1.1精确宽度整数类型
  (int64_t)....如果实现提供带有   宽度为8位,16位,32位或64位,无填充位,并且(对于有符号类型)具有二进制补码表示,则应定义相应的typedef名称。

处理器的位宽不是此功能的因素-必须存在long long。如果该long long(或任何标准类型是64位2的补充),那么int64_t 必须也存在。处理器的位宽确实会影响性能


@R..评论强调,{64}占用64位内存进行编码的long long只能支持[-0x7fff-ffff-ffff-ffff ... + 0x7fff的范围-ffff-ffff-ffff],比[-0x8000-0000-0000-0000 ... + 0x7fff-ffff-ffff-ffff]的int64_t范围少一。如果有的话,这些天这些平台已经非常稀有了。

答案 2 :(得分:1)

否,C99没有强制使用int64_t类型。

(感谢@ user3386109,@Clifford)

不需要int64_t类型。引用C99 standard draft document N1256

  

7.18.11.1精确宽度整数类型

     
      
  1. typedef名称int N _t指定带符号的整数类型,等等。   ...
  2.   
  3. 这些类型是可选的。但是,如果实现提供的整数类型的宽度为... 64位...具有两个补码   表示形式...应定义相应的typedef名称。
  4.   

但是请参阅@chux和@JohnBollinger关于long long具有64位的答案。

答案 3 :(得分:1)

integer types有三套:

  • intN_t-例如int64_t及其未签名的副本;这些确切类型可能不可用。
  • int_leastN_t-例如int_least64_t;类型int_least8_tint_least16_tint_least32_tint_least64_t以及它们的未签名副本是必需的-其他类型是可选的。
  • int_fastN_t-例如int_fast64_t;必需使用int_fast8_tint_fast16_tint_fast32_tint_fast64_t类型(它们是最快的类型,至少具有给定的宽度)。

该标准还要求支持long longlong long的最小可接受范围至少需要64位(请参阅§5.2.4.1 Sizes of integer types <limits.h>)。因此,该标准可以合法地要求对64位或更多位的“最小”和“快速”类型提供支持-它也要求支持long long

过去曾经有36位字的计算机,而其他有60位字的计算机。这两种方法都很难提供(基本上是“无法提供”)确切的宽度类型,但可以轻松地为“最小”和“快速”类型提供支持。

该标准不要求使用“精确宽度类型”-参见§7.20.1.1 Exact-width integer types ¶3

  

这些类型是可选的。但是,如果实现提供的整数类型的宽度为8位,16位,32位或64位,没有填充位,并且(对于有符号类型)具有二进制补码表示,则它应定义相应的typedef名称。