我知道C语言的规范没有规定每个整数类型的确切大小(例如int
)。
我想知道的是:C(不是C ++)中是否有一种方法可以定义具有特定大小的整数类型,以确保它在不同的体系结构中是相同的?像:
typedef int8 <an integer with 8 bits>
typedef int16 <an integer with 16 bits>
或任何其他允许程序的其他部分在不同架构上编译的方式。
答案 0 :(得分:15)
你想要的是<stdint.h>
,符合C标准(“C99”)的编译器将实现。不幸的是,这不包括微软。幸运的是,一个开源项目为Windows提供<stdint.h>
,请参阅msinttypes。
这样您就可以使用int32_t
和uint32_t
,以及8,16和64以及其他许多内容。
注意:标题文件本身在标准中不是可选的,但是标题中的大多数类型都是可选的。有些不是。最常用的类型是可选类型,但没有什么能阻止您使用所需类型。问题是,如果实现提供了标题,实际上它们定义了所有类型。
答案 1 :(得分:13)
C99,在stdint.h中,定义了int8_t
和int16_t
等类型。
答案 2 :(得分:5)
不,C标准规定了整数类型的最小尺寸,但不保证最大尺寸。
如果该类型的类型可用,则实现应提供intN_t
类型。我只提到,因为你有一个跨平台标签 - 没有正确位宽类型的实现不需要提供这些类型。
您通常可以选择(使用设置定义,例如,cc -D_INT16_IS_INT
和#ifdef
s)用于特定位大小的正确类型。您可以使用CHAR_BIT
和sizeof()
为要使用C代码支持的每个平台制定所需的定义。
c1x草案(n1362)的相关部分是:
7.18.1.1精确宽度整数类型
typedef名称intN_t
指定带宽为N
的有符号整数类型,无填充位和二进制补码表示。因此,int8_t
表示有符号整数类型,宽度恰好为8位。
typedef名称uintN_t
指定宽度为N
的无符号整数类型。因此,uint24_t
表示无符号整数类型,宽度恰好为24位。
这些类型是可选的。但是,如果实现提供宽度为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
答案 3 :(得分:2)
除非您检查每个平台#ifdef
左右,否则我很怀疑它很容易。但是很多图书馆已经为你完成了这项任务。对于MSVC,它是__int8
, __int16
, &c. GTK库具有类似的typedef。
答案 4 :(得分:2)
据我所知,答案是否定的。我们为不同的平台编码,我们只使用#if /#else对特定平台使用typedef。例如,在Win32上:typedef int int32;
此致
Sebastiaan
答案 5 :(得分:2)
您可能需要查看pstdint.h。它是stdint.h的可移植实现,不需要C99编译器支持。
答案 6 :(得分:0)
你总是可以编写一个算术库,使用unsigned char的数字作为数字。这样你可以使用你想要的任何比特长度的数字,甚至允许比特长度变化。
实际上,您不需要实现这样的库,因为GNU MP已经处理了这个。