这与以下问题有关,
有几个人提到 int 在大多数平台上始终是 32 位的。我很好奇这是不是真的。
您知道任何具有不同大小的 int 的现代平台吗?忽略具有 8 位或 16 位架构的恐龙平台。
注意: 我已经知道如何从另一个问题声明一个 32 位整数。这更像是一项调查,以找出哪些平台(CPU/OS/编译器)支持其他大小的整数。
这与以下问题有关,
有几个人提到 int 在大多数平台上始终是 32 位的。我很好奇这是不是真的。
您知道任何具有不同大小的 int 的现代平台吗?忽略具有 8 位或 16 位架构的恐龙平台。
注意: 我已经知道如何从另一个问题声明一个 32 位整数。这更像是一项调查,以找出哪些平台(CPU/OS/编译器)支持其他大小的整数。
正如一些人所说,不能保证“int”将是 32 位,如果您想使用特定大小的变量,特别是在编写涉及位操作的代码时,您应该使用强制要求的“标准整数类型”由 c99 规范。
int8_t
uint8_t
int32_t
uint32_t
ETC...
它们通常采用 [u]intN_t 形式,其中 'u' 指定您想要一个无符号数,N 是位数
在您编译的任何平台上,stdint.h 中都应该提供这些正确的 typedef,使用这些可以让您编写漂亮的、可移植的代码 :-)
“在大多数平台上始终是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_t
和uintN_t
:
typedef
名称intN_t
指定了一个有符号整数类型,其宽度N
、无填充位和二进制补码表示。因此,int8_t
表示宽度正好为 8 位的有符号整数类型。typedef
名称uintN_t
指定了一个带宽度的无符号整数类型N
。因此,uint24_t
表示宽度正好为 24 位的无符号整数类型。typedef
名称。目前,大多数桌面和服务器平台使用 32 位整数,甚至许多嵌入式平台(想想手持 ARM 或 x86)使用 32 位int
。要达到 16 位int
,您必须做得非常小:想想“Berkeley mote”或一些较小的 Atmel Atmega 芯片。但他们在外面。
不可以。小型嵌入式系统使用 16 位整数。
这在很大程度上取决于您的编译器。有些在 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;
}
嗯,大多数基于 ARM 的处理器都可以运行 Thumb 代码,这是一种 16 位模式。其中包括传闻中的 Android 笔记本电脑和最先进的智能手机。
此外,一些图形计算器使用 8 位处理器,我也称它们为相当现代的。
TI 仍在销售带有 C55x DSP 的 OMAP 板,主要用于视频解码。我相信为此提供的编译器具有 16 位 int。它几乎不是恐龙(诺基亚 770 于 2005 年发布),尽管您可以获得 32 位 DSP。
您编写的大多数代码,您可以放心地假设它永远不会在 DSP 上运行。但也许不是全部。
如果您还对实际的 Max/Min Value 而不是位数感兴趣,limits.h几乎包含您想知道的所有内容。