C中的int总是32位吗?

Posted

技术标签:

【中文标题】C中的int总是32位吗?【英文标题】:Is int in C Always 32-bit? 【发布时间】:2010-11-16 21:34:18 【问题描述】:

这与以下问题有关,

How to Declare a 32-bit Integer in C

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

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

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

【问题讨论】:

有现代的 8 位和 16 位处理器,只是在 PC 环境中没有。 【参考方案1】:

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

int8_t
uint8_t
int32_t
uint32_t

等等……

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

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

【讨论】:

当然,我刚刚检查过,我认为这在 windows 上坏了:blogs.msdn.com/oldnewthing/archive/2005/01/31/363790.aspx 但这听起来不对,所以我要仔细检查我兄弟的 windows 机器。 请记住,这些类型在 C99 中是可选的。如果实现提供了正确属性的底层类型,它必须为您提供相应的[u]intN_t 类型,但不能保证实现将具有这样的类型。但是,它们会很少而且相差甚远,因此如果您的编译器符合 C99 标准,这可能是最好的方法。 @paxdiablo ,uint_least,fast8,16,32,16_t 类型在 C99(第 7.18.1.1 节)中是 必需的。它们可以用于几乎相同的目的——唯一需要注意的是,它们只能保证至少(而不是完全)8/16/32/ 64 位宽。 好点,@Craig,此答案中明确列出的类型不是,但您始终可以使用可能更宽的类型并忽略三十秒剩下的任何位。【参考方案2】:

“在 大多数 平台上总是 32 位” - 那个 sn-p 有什么问题? :-)

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


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

【讨论】:

打败我 :) 在 C 或 C++ 中依赖内置变量的大小本质上是一个错误。 C 标准确实规定了最小范围(这意味着最小尺寸)。 int 的最小范围是-32767 到+32767,long 的最小范围是-2147483647 到+2147483647。 (这意味着如果您只想要一个可以存储 32 位整数范围的变量,请使用 long 或 unsigned long - 不需要预处理器)。 @Justin,你可能迟到了,但你似乎是过去三年多来唯一一个受到关注的人。很好的捕获,已更改为修复。 @caf:总是使用long 虽然int 就足够了,但似乎很愚蠢。我需要一个可以存储数字 0 到 999,999,999 的变量,并且当 32 位足够多时,我不希望它是 64 位宽(就像 longs 有时那样)。整数类型intN_t 从一开始就不可用,这似乎很奇怪。他们意识到不同位宽的 CPU 将运行 C 软件,但他们没有为保证 30 年位宽的便携方式而烦恼?【参考方案3】:

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

【讨论】:

是的,唯一真正回答问题的答案!但是,很高兴知道您从哪里得到答案以及使用 32 位的特定编译器/平台,或者可能只是不使用 32 位的编译器/平台。【参考方案4】:

没有。小型嵌入式系统使用 16 位整数。

【讨论】:

有趣的事实:sizeof(int) == 1 在某些 TI DSP 上,例如C2000。 charint 都有 16 位(当然还有 short)。【参考方案5】:

这很大程度上取决于您的编译器。有些在 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;

【讨论】:

这在很多方面都是错误的。首先,sizeof 可以对类型进行操作,因此不需要randomint。其次,CHAR_BITS 不保证为八。还有一些事情,但这些是与问题相关的错误。 是的,并不总是一个字节中的 8 位 @Eric 它的CHAR_BIT。我在评论中拼错了。 也不能保证该类型的底层表示中的每个位都是一个值位 - 您可能有溢出位(甚至填充位)之类的东西。【参考方案6】:

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

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

【讨论】:

你不能有一个符合 8 位 int 的 C 实现,所以即使这些计算器是 8 位的,如果他们有一个 C 编译器,那么它必须使 int 至少为 16 位。跨度> Thumb 代码仍然使用 32 位 int; “16 位”方面只是编码指令的大小。 在 ANSI C 标准中,int 和 short int 可接受的最小尺寸是 16 位,所以没有办法有 8 位..:)【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于C中的int总是32位吗?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 Int 和 Int32 有啥区别?

c - 整数向下转换

java中int变量和C语言中int变量的取值范围不一样

smartgit分64位和32位吗

STM32编译错误,初学者求指点

如果我有32位本机库,Android应用程序仍然是64位吗?