题
这与以下问题有关,
有几个人提到 int 在大多数平台上始终是 32 位。我很好奇这是否属实。
您知道有不同大小的 int 的现代平台吗?忽略具有 8 位或 16 位架构的恐龙平台。
笔记: 我已经知道如何从另一个问题中声明 32 位整数。这更像是一项调查,旨在找出哪些平台(CPU/OS/编译器)支持其他大小的整数。
解决方案
由于几个人都表示,没有保证,一个“诠释”将是32位的,如果你想使用一个特定大小的变量,尤其是写作,涉及的位操作代码时,你应该使用“标准整数类型由C99规范规定的。
int8_t
uint8_t
int32_t
uint32_t
等...
它们通常的形式为[U] intN_t,其中“U”指定要一个无符号的数量,以及N是位的数目的
对于这些正确的类型定义应该是在哪个平台要编译支持,利用这些可以让你写得真好,可移植的代码stdint.h可供选择: - )
其他提示
“是 总是 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_t
和 uintN_t
:
- 这
typedef
姓名intN_t
指定具有宽度的有符号整数类型N
, ,无填充位,以及二进制补码表示。因此,int8_t
表示宽度恰好为 8 位的有符号整数类型。 - 这
typedef
姓名uintN_t
指定具有宽度的无符号整数类型N
. 。因此,uint24_t
表示宽度恰好为 24 位的无符号整数类型。 - 这些类型是可选的。但是,如果实现提供宽度为 8、16、32 或 64 位的整数类型,无填充位,并且(对于有符号类型)具有二进制补码表示形式,则它应定义相应的
typedef
名称。
在这个时刻,大多数台式机和服务器平台使用32位整数,甚至许多嵌入式平台(认为手持ARM或x86)使用32位int
s。为了得到你要得到确实非常小的16位int
:认为“伯克利微尘”或一些较小的爱特梅尔的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位的整型。这是根本没有恐龙(诺基亚770是在2005年发布),尽管你可以得到32位的DSP。
你写的大多数代码,你可以安全地假设它永远不会在DSP上运行。但也许不是全部。
如果你也有兴趣在实际的最大/最小值,而不是位的数量, limits.h中包含你想知道几乎一切。