当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《不同体系结构中C的int大小》经验,为你挑选了3个好方法。

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

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

typedef int8 
typedef int16 

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



1> DigitalRoss..:

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

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

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



2> Martin v. Lö..:

在stdint.h中,C99 定义类似int8_t和的类型int16_t.



3> paxdiablo..:

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

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

您通常可以选择(使用设置定义,例如,cc -D_INT16_IS_INT#ifdefs)用于特定位大小的正确类型.您可以使用CHAR_BIT和编写要使用C代码支持的每个平台所需的定义sizeof().

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


如果你想在系统没有确切大小时失败,那么只需使用`int8_t`或`int16_t` - 如果系统没有它们,构建将失败 - 不需要条件代码.如果您不想失败但使用下一个最佳类型,请使用int_least8_t或int_least16_t.
推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有