22

这与以下问题有关,

如何在 C 中声明一个 32 位整数

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

您知道任何具有不同大小的 int 的现代平台吗?忽略具有 8 位或 16 位架构的恐龙平台。

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

4

8 回答 8

43

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

int8_t
uint8_t
int32_t
uint32_t

ETC...

它们通常采用 [u]intN_t 形式,其中 'u' 指定您想要一个无符号数,N 是位数

在您编译的任何平台上,stdint.h 中都应该提供这些正确的 typedef,使用这些可以让您编写漂亮的、可移植的代码 :-)

于 2009-08-05T06:06:36.557 回答
17

“在大多数平台上始终是32 位” - 该片段有什么问题?:-)

C 标准不强制规定其许多整数类型的大小。例如,它确实规定了相对大小,sizeof(int) >= sizeof(short)等等。它还规定了最小范围,但允许多种编码方案(二进制补码、二进制补码和符号/幅度)。

如果你想要一个特定大小的变量,你需要使用一个适合你运行的平​​台的变量,比如使用#ifdef's,比如:

#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


  1. typedef名称intN_t指定了一个有符号整数类型,其宽度N、无填充位和二进制补码表示。因此,int8_t表示宽度正好为 8 位的有符号整数类型。
  2. typedef名称uintN_t指定了一个带宽度的无符号整数类型N。因此,uint24_t表示宽度正好为 24 位的无符号整数类型。
  3. 这些类型是可选的。但是,如果实现提供了宽度为 8、16、32 或 64 位的整数类型,没有填充位,并且(对于有符号类型)具有二进制补码表示,则它应定义相应的typedef名称。
于 2009-08-05T04:22:11.307 回答
9

目前,大多数桌面和服务器平台使用 32 位整数,甚至许多嵌入式平台(想想手持 ARM 或 x86)使用 32 位int。要达到 16 位int,您必须做得非常小:想想“Berkeley mote”或一些较小的 Atmel Atmega 芯片。但他们在外面。

于 2009-08-05T05:54:17.720 回答
4

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

于 2009-08-05T05:16:51.803 回答
2

这在很大程度上取决于您的编译器。有些在 64 位机器上将它们编译为 64 位,有些将它们编译为 32 位。嵌入式系统是它们自己的小特殊蜡球。

您可以做的最好的检查是:

printf("%d\n", sizeof(int));

请注意,这sizeof将打印出字节。做得到sizeof(int)*CHAR_BIT位。

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

#include <limits.h>
#include <stdio.h>

int main(void) {
    printf("short is %d bits\n",     CHAR_BIT * sizeof( short )   );
    printf("int is %d bits\n",       CHAR_BIT * sizeof( int  )    );
    printf("long is %d bits\n",      CHAR_BIT * sizeof( long )    );
    printf("long long is %d bits\n", CHAR_BIT * sizeof(long long) );
    return 0;
}
于 2009-08-05T04:11:13.917 回答
1

嗯,大多数基于 ARM 的处理器都可以运行 Thumb 代码,这是一种 16 位模式。其中包括传闻中的 Android 笔记本电脑和最先进的智能手机。

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

于 2009-08-05T07:17:02.560 回答
1

TI 仍在销售带有 C55x DSP 的 OMAP 板,主要用于视频解码。我相信为此提供的编译器具有 16 位 int。它几乎不是恐龙(诺基亚 770 于 2005 年发布),尽管您可以获得 32 位 DSP。

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

于 2009-08-05T12:04:33.837 回答
0

如果您还对实际的 Max/Min Value 而不是位数感兴趣,limits.h几乎包含您想知道的所有内容。

于 2009-08-05T12:22:41.783 回答