这与以下问题有关,
How to Declare a 32-bit Integer in C
在大多数平台上,有几个人提到int总是32位。如果这是真的,我很好奇。
你知道任何具有不同大小的int的现代平台吗?忽略具有8位或16位架构的恐龙平台。
注意: 我已经知道如何从另一个问题声明一个32位整数。这个更像是一项调查,以找出哪些平台(CPU / OS /编译器)支持其他大小的整数。
答案 0 :(得分:41)
正如有几个人所说,不能保证'int'将是32位,如果你想使用特定大小的变量,特别是在编写涉及位操作的代码时,你应该使用'标准整数c99规范规定的类型。
int8_t
uint8_t
int32_t
uint32_t
等...
它们的形式通常为[u] intN_t,其中'u'指定您需要无符号数量,N是位数
在你正在编译的平台上,stdint.h中应该提供正确的typedef,使用这些可以编写漂亮的可移植代码: - )
答案 1 :(得分:16)
“ 始终 平台上的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位。typedef
名称答案 2 :(得分:6)
目前,大多数桌面和服务器平台都使用32位整数,甚至许多嵌入式平台(比如手持式ARM或x86)都使用32位int
。要获得16位int
,你必须确实变得非常小:想想“Berkeley mote”或者一些较小的Atmel Atmega芯片。但他们在那里。
答案 3 :(得分:3)
没有。小型嵌入式系统使用16位整数。
答案 4 :(得分: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;
}
答案 5 :(得分:1)
好吧,大多数基于ARM的处理器都可以运行Thumb代码,这是一种16位模式。其中包括尚未传闻的Android笔记本电脑和最前沿的智能手机。
另外,一些图形计算器使用8位处理器,我也称它们相当现代。
答案 6 :(得分:1)
您编写的大多数代码都可以安全地假设它不会在DSP上运行。但也许不是全部。
答案 7 :(得分:0)
如果您对实际的最大值/最小值而不是位数感兴趣,limits.h几乎包含您想知道的所有内容。