不同体系结构中C的int大小

我知道C语言的规范并没有规定每个整数类型的确切大小(例如, int )。

我想知道的是:C(不是C ++)中是否有一种方法来定义具有特定大小的整数类型,以确保它在不同的体系结构中是相同的? 喜欢:

 typedef int8  typedef int16  

或者任何其他允许程序的其他部分在不同体系结构上编译的方式。

你想要的是 ,符合C标准(“C99”)的编译器将实现。 不幸的是,这不包括微软。 幸运的是,一个开源项目为Windows提供了一个 ,请参阅msinttypes 。

这将允许您使用int32_tuint32_t ,以及8,16和64以及许多其他。

注意:标题文件本身在标准中不是可选的,但是标题中的大多数类型都是可选的。 有些不是。 最常用的类型是可选类型,但没有什么能阻止您使用所需类型。 问题是,如果实现提供了标题,实际上它们定义了所有类型。

在stdint.h中 ,C99定义了类似int8_tint16_t类型。

不,C标准规定了整数类型的最小尺寸,但不保证最大尺寸。

如果该类型的类型可用,则实现应提供intN_t类型。 我只提到,因为你有一个跨平台标签 – 没有正确位宽类型的实现不需要提供这些类型。

您通常可以选择(使用设置定义,例如, cc -D_INT16_IS_INT#ifdef s)用于特定位大小的正确类型。 您可以使用CHAR_BITsizeof()为要使用C代码支持的每个平台计算所需的定义。

c1x草案(n1362)的相关部分是:


7.18.1.1精确宽度整数类型

  1. typedef name intN_t指定一个有符号整数类型,其宽度为N ,没有填充位和二进制补码表示。 因此, int8_t表示宽度恰好为8位的有符号整数类型。

  2. typedef名称uintN_t指定宽度为N的无符号整数类型。 因此, uint24_t表示无符号整数类型,其宽度恰好为24位。

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


关于类型的选择,这样的事情就足够了:

 #ifdef INT32_IS_SHORT typedef short INT32 #endif #ifdef INT32_IS_INT typedef int INT32 #endif #ifdef INT32_IS_LONG typedef long INT32 #endif 

除非你用#ifdef左右检查每个平台,否则我很怀疑它是否容易实现。 但是许多图书馆已经为您完成了这项任务。 对于MSVC,它是__int8__int16和c。 GTK库具有类似的typedef。

据我所知,答案是否定的。 我们为不同的平台编码,我们只使用#if /#else对特定平台使用typedef。 例如在Win32上:typedef int int32;

问候,

Sebastiaan

你可能想看一下pstdint.h 。 它是stdint.h的可移植实现,不需要C99编译器支持。

您总是可以编写一个算术库,使用unsigned char的数字作为数字。 这样你可以使用你想要的任何比特长度的数字,甚至允许比特长度变化。

实际上,您不需要实现这样的库,因为GNU MP已经处理了这个。

http://gmplib.org/