C中的int总是32位吗?

Is int in C Always 32-bit?

这与以下问题有关,

如何在C中声明32位整数

有人提到int在大多数平台上总是32位的。我很好奇这是不是真的。

你知道有什么不同尺寸的现代平台吗?忽略具有8位或16位架构的恐龙平台。

注意:我已经知道如何从另一个问题中声明32位整数。这个更像是一个调查,找出哪些平台(CPU/OS/编译器)支持其他大小的整数。


正如一些人所说,不保证"int"是32位的,如果您想使用特定大小的变量,特别是在编写涉及位操作的代码时,您应该使用c99规范规定的"标准整数类型"。

1
2
3
4
int8_t
uint8_t
int32_t
uint32_t

等。。。

它们通常采用[u]intn_t的形式,其中"u"指定您需要无符号数量,n是位数。

这些的正确typedef应该在stdint.h中的任何平台上都可用,使用这些typedef可以编写好的可移植代码:-)


"在大多数平台上总是32位的"-这段代码有什么问题?-)

C标准并没有规定许多整型的尺寸。它确实规定了相对大小,例如,sizeof(int) >= sizeof(short)等。它还要求最小范围,但允许多个编码方案(两个补码、一个补码和符号/幅度)。

如果需要特定大小的变量,则需要使用适合运行平台的变量,例如使用#ifdef的变量,例如:

1
2
3
4
5
6
7
8
9
#ifdef LONG_IS_32BITS
    typedef long int32;
#else
    #ifdef INT_IS_32BITS
        typedef int int32;
    #else
        #error No 32-bit data type available
    #endif
#endif

或者,C99及以上允许使用精确的宽度整数类型intN_tuintN_t

  • typedef名称intN_t指定一个带符号的整数类型,宽度为N,没有填充位,有一个二的补码表示。因此,int8_t表示宽度正好为8位的有符号整数类型。
  • typedef名称uintN_t指定宽度为N的无符号整数类型。因此,uint24_t表示宽度正好为24位的无符号整数类型。
  • 这些类型是可选的。但是,如果一个实现提供宽度为8、16、32或64位的整数类型,没有填充位,并且(对于有符号的类型)有两个补码表示,则它应定义相应的typedef名称。

  • 此时此刻,大多数桌面和服务器平台都使用32位整数,甚至许多嵌入式平台(如手持机或x86)也使用32位int。要获得16位int,您必须获得非常小的空间:想想"Berkeley Mote"或一些较小的Atmel Atmega芯片。但他们在外面。


    不。小型嵌入式系统使用16位整数。


    它很大程度上取决于您的编译器。有些在64位机器上将它们编译为64位,有些则将它们编译为32位。嵌入式系统本身就是一个特殊的蜡球。

    最好的检查方法是:

    1
    2
    printf("%d
    "
    , sizeof(int));

    注意,sizeof将打印出字节。执行sizeof(int)*CHAR_BIT以获取位。

    用于打印各种类型的位数的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <limits.h>
    #include <stdio.h>

    int main(void) {
        printf("short is %d bits
    "
    ,     CHAR_BIT * sizeof( short )   );
        printf("int is %d bits
    "
    ,       CHAR_BIT * sizeof( int  )    );
        printf("long is %d bits
    "
    ,      CHAR_BIT * sizeof( long )    );
        printf("long long is %d bits
    "
    , CHAR_BIT * sizeof(long long) );
        return 0;
    }


    TI仍在销售带有C55X DSP的OMAP板,主要用于视频解码。我相信为它提供的编译器有一个16位的整数。它不是恐龙(诺基亚770于2005年发布),尽管你可以得到32位的DSP。

    您编写的大多数代码,都可以安全地假设它不会在DSP上运行。但也许不是全部。


    大多数基于ARM的处理器都可以运行拇指代码,这是一种16位模式。其中包括迄今为止唯一传言的安卓笔记本电脑和最前沿的智能手机。

    另外,一些图形计算器使用8位处理器,我也会称之为相当现代的。


    如果您还对实际的最大/最小值感兴趣,而不是位的数量,limits.h包含了您想要知道的几乎所有内容。