C99标准是否要求合格的编译器定义(并且可用)64位int64_t
?还是它是可选的,而恰好是所有流行的编译器都定义了它?我显然是在特别询问有关CPU无法直接在其上处理64位值的平台的问题,但问题是更普遍的
我无法真正从C data types Wikipedia page或从this answer到相关问题中解决这个问题。
答案 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)
int64_t
类型。(感谢@ user3386109,@Clifford)
不需要int64_t
类型。引用C99 standard draft document N1256:
7.18.11.1精确宽度整数类型
- typedef名称int N _t指定带符号的整数类型,等等。 ...
- 这些类型是可选的。但是,如果实现提供的整数类型的宽度为... 64位...具有两个补码 表示形式...应定义相应的typedef名称。
但是请参阅@chux和@JohnBollinger关于long long
具有64位的答案。
答案 3 :(得分:1)
integer types有三套:
intN_t
-例如int64_t
及其未签名的副本;这些确切类型可能不可用。int_leastN_t
-例如int_least64_t
;类型int_least8_t
,int_least16_t
,int_least32_t
和int_least64_t
以及它们的未签名副本是必需的-其他类型是可选的。int_fastN_t
-例如int_fast64_t
;必需使用int_fast8_t
,int_fast16_t
,int_fast32_t
和int_fast64_t
类型(它们是最快的类型,至少具有给定的宽度)。该标准还要求支持long long
,long 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名称。