C中的int总是32位吗?

这与以下问题有关,

如何在C中声明32位整数

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

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

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

正如几个人所说,不能保证’int’将是32位,如果你想使用特定大小的变量,特别是在编写涉及位操作的代码时,你应该使用’标准整数类型’强制按照c99规范。

int8_t uint8_t int32_t uint32_t 

等等…

它们通常的forms为[u] intN_t,其中’u’指定您需要无符号数量,N是位数

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

“在大多数平台上总是 32位” – 这个片段有什么问题? 🙂

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

如果你想要一个特定大小的变量,你需要使用一个适合你正在运行的平台,例如使用#ifdef ,如:

 #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 name intN_t指定一个有符号整数类型,其宽度为N ,没有填充位和二进制补码表示。 因此, int8_t表示宽度恰好为8位的有符号整数类型。
  2. typedef名称uintN_t指定宽度为N的无符号整数类型。 因此, uint24_t表示无符号整数类型,其宽度恰好为24位。
  3. 这些类型是可选的。 但是,如果实现提供宽度为8,16,32或64位的整数类型,没有填充位,并且(对于具有二进制补码表示的有符号类型),它应定义相应的typedef名称。

在这个时候,大多数桌面和服务器平台使用32位整数,甚至许多嵌入式平台(想想手持式ARM或x86)使用32位int 。 要获得16位的内存,你必须确实变得非常小:想想“Berkeley mote”或者一些较小的Atmel Atmega芯片。 但他们在那里。

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

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

你可以做的最好的事情来检查:

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

请注意, sizeof将打印出字节。 使用sizeof(int)*CHAR_BIT来获取位。

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

 #include  #include  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; } 

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

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

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

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

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