C中的int总是32位吗?

ZZ *_*der 20 c int

这与以下问题有关,

如何在C中声明32位整数

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

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

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

Dav*_*dge 42

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

int8_t
uint8_t
int32_t
uint32_t
Run Code Online (Sandbox Code Playgroud)

等等...

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

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

  • @paxdiablo 不过,`{,u}int_{least,fast}{8,16,32,16}_t` 类型在 C99 (§7.18.1.1) 中是*必需的*。它们可以用于几乎相同的目的——唯一需要注意的是它们只能保证*至少*(而不是*完全*)8/16/32/64 位宽。 (2认同)

pax*_*blo 17

" 在大多数平台上总是 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
Run Code Online (Sandbox Code Playgroud)

或者,C99及更高版本允许精确的宽度整数类型intN_tuintN_t:


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

  • C标准规定了最小范围(这意味着最小尺寸).int的最小范围是-32767到+32767,最小长度范围是-2147483647到+2147483647. (7认同)
  • (这意味着如果您只想要一个可以存储32位整数范围的变量,请使用long或unsigned long - 不需要预处理器的bodginess). (3认同)
  • 打败我:)依赖C或C++中内置变量的大小本身就是一个错误. (2认同)
  • @Justin,你可能会很晚,但你似乎是唯一一个在过去三年里注意到的人.好抓,改成修理. (2认同)
  • @caf:总是使用`long`虽然`int`就足够了但是看起来很傻.我需要一个可以存储数字0到999,999,999的变量,而且当32位很多时,我宁愿没有它是64位宽(有时候很长).从一开始就没有可用的整数类型`intN_t`似乎很奇怪.他们意识到不同位宽的CPU将运行C软件,但他们没有费心去保证位宽30年的便携方式? (2认同)

Nor*_*sey 7

目前,大多数桌面和服务器平台都使用32位整数,甚至许多嵌入式平台(比如手持式ARM或x86)都使用32位int.要想达到16位,int你必须确实变得非常小:想想"Berkeley mote"或者一些较小的Atmel Atmega芯片.但他们在那里.

  • 是的,唯一真正回答问题的答案!但是,如果您知道从哪里得到这个答案以及使用 32 位的特定编译器/平台,或者只是不使用 32 位的编译器/平台,那就太好了。 (3认同)

sta*_*lue 6

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