C99是否要求"int64_t"类型可用?

ein*_*ica 2 c 64-bit c99 language-lawyer

C99标准是否要求符合标准的编译器具有64位int64_t 定义(和可用)?或者它是可选的,恰好被所有流行的编译器定义?我显然要特别询问CPU无法直接处理64位值的平台,但问题更为笼统

我不能真正从C数据类型维基百科页面中找出这一点,也不能从这个相关问题的答案中解决这个问题.

Joh*_*ger 5

C99标准是否要求符合标准的编译器定义(并且可用)64位int64_t?或者它是可选的,恰好被所有流行的编译器定义?

在某种意义上,类型是可选的,并且在不同意义上有条件地要求.具体来说,C99说,

typedef name intN_t指定一个有符号整数类型,其宽度为N,没有填充位和二进制补码表示.[...]

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

因此,int64_t在某种意义上是可选的,即不需要符合要求的实现来提供与a的特征完全匹配的任何类型,int64_t如果没有,那么它不需要(实际上,必须不能,根据另一部分)提供类型int64_t.

C99确实指定存在一种类型,long long int其所需的最小范围需要至少64位宽的表示.现在有可能在某些实现中没有正好 64位宽的有符号整数类型(例如,可能int是24位,long48 位和long long96位),并且可能存在64位值的整数类型,但是它包含填充位或不以二进制补码表示.这样的实现可以完全符合,但是没有定义int64_t.然而,在实践中,目前没有任何此类实现常用.