代码之家  ›  专栏  ›  技术社区  ›  NawaMan

不同体系结构上的int在c中的大小

  •  9
  • NawaMan  · 技术社区  · 15 年前

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

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

    typedef int8 <an integer with 8 bits>
    typedef int16 <an integer with 16 bits>
    

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

    7 回复  |  直到 15 年前
        1
  •  15
  •   DigitalRoss    15 年前

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

    这将允许您使用 int32_t uint32_t ,加上8、16和64,还有许多其他的。

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

        2
  •  13
  •   Martin v. Löwis    15 年前

    C99,in stdint.h ,定义类型如下 int8_t int16_t .

        3
  •  5
  •   paxdiablo    15 年前

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

    实施应提供 intN_t 类型(如果该大小的类型可用)。我只提到,因为您有一个跨平台标记——一个没有正确位宽度类型的实现不需要提供这些类型。

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

    C1X草案(N1362)的相关章节为:


    7.18.1.1精确宽度整数类型

    1. typedef名称 因特 用宽度指定带符号整数类型 N ,没有填充位和一个二s补码表示。因此, int8_t 表示宽度正好为8位的有符号整数类型。

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

    3. 这些类型是可选的。但是,如果一个实现提供宽度为8、16、32或64位的整数类型,没有填充位,并且(对于有符号的类型)具有两个s补码表示,则它应定义相应的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
    
        4
  •  2
  •   Joey Gumbo    15 年前

    除非你检查每个站台 #ifdef 大概吧,我怀疑这很容易实现。但许多图书馆已经为您完成了这项任务。对于MSVC来说 __int8 , __int16 , &c. GTK库具有类似的typedef。

        5
  •  2
  •   Sebastiaan M    15 年前

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

    当做,

    塞巴斯蒂安

        6
  •  2
  •   Marcin Koziuk    15 年前

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

        7
  •  0
  •   Michael Dillon    15 年前

    您总是可以编写一个算术库,它使用无符号字符的向量作为数字。这样,您就可以使用任意位长度的数字,甚至允许位长度变化。

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

    http://gmplib.org/