"int"和"int_fast16_t"有什么区别?

som*_*ver 38 c int portability c99 c89

据我了解,C规范说该类型int应该是目标平台上包含至少16位的最有效类型.

那不就是C99的定义int_fast16_t吗?

也许他们只是为了保持一致而把它放在那里,因为int_fastXX_t需要另一个?

更新

总结下面的讨论:

  • 我的问题在许多方面都是错误的.C标准没有为int指定位数.它给出了必须包含的范围[-32767,32767].
  • 我开始意识到,大多数人会说,"但这个范围至少意味着16位!" 但是C不需要二进制补码(甚至是二进制)整数存储.如果他们说"16位",可能会有一些平台具有1位奇偶校验,1位符号和14位幅度,仍然"符合标准",但不满足该范围.
  • 标准没有说int是最有效的类型.除了上面的大小要求之外,int可以由编译器开发人员根据他们认为最重要的标准来决定.(速度,大小,向后兼容性等)
  • 另一方面,int_fast16_t就像向编译器提供一个提示,它应该使用对性能最佳的类型,可能以牺牲任何其他权衡为代价.
  • 同样,int_least16_t会告诉编译器使用> = 16位的最小类型,即使它会更慢.适用于保留大型阵列和空间中的空间.

示例: x86-64上的MSVC具有32位int,即使在64位系统上也是如此.MS选择这样做是因为太多人认为int总是正好是32位,因此很多ABI会破坏.但是,如果x86-64上的64位值更快,则int_fast32_t可能是64位数.(我不认为实际情况如此,但它只是证明了这一点)

chu*_*ica 31

int速度/尺寸是"最有效的类型" - 但不是根据C规范指定的.它必须是16位或更多位.

int_fast16_t是最有效的速度类型,至少是16位int的范围.

示例:给定平台可能已经确定int应该是32位,原因很多,而不仅仅是速度.对于16位整数,同一系统可能会发现不同的类型最快.

示例:在64位计算机中,人们希望将其int作为64位,编译器可以使用具有32位int编译的模式以实现兼容性.在这种模式下,int_fast16_t可能是64位,因为它本身是最快的宽度,它避免了对齐问题等.

  • 这似乎最有意义......所以你说"INT"可能并不是专为速度选择,但有些类型的空间/时间权衡,编译器开发商制作的平台,而int_fast16_t像你说, "我不关心太空,我想快点"?好像是正确答案...... (5认同)

Nat*_*ica 24

int_fast16_t保证是最快的int,大小至少为16位. int除了以下情况外,不保证其大小:

 sizeof(char) = 1 and sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).
Run Code Online (Sandbox Code Playgroud)

并且它可以保持-32767到+32767的范围.

(7.20.1.3p2)"typedef名int_fastN_t表示具有至少一个宽度最快符号整型Ñ.typedef名uint_fastN_t表示具有至少一个宽度最快无符号整型Ñ ".

  • @ask_me_about_loom:但是如果标准说"最小16位",那么即使它与范围要求不匹配,*16位*符号 - 尾数实现也是合法的.这就是指定范围的原因,这就是为什么范围是描述标准实际所说内容的唯一正确方法的原因. (6认同)
  • @Kevin神圣的地狱,你是对的!我想有一种类型可以有16位但仍然无法保持该范围的方式!哇!心灵爆炸!我一直想知道为什么他们给出范围,而不仅仅是说"16位".这是一个很好的观点! (5认同)
  • 您关于类型的相对大小的陈述是正确的,但是您没有最小尺寸.C标准说"char"必须至少为8位,"short"至少为16,"int"至少为16,"long"至少为32 (4认同)
  • @OlivierPoulin`int`需要至少16位.它符合C标准. (4认同)
  • @NathanOliver通过指定范围,它们必须指定最小大小.仅仅因为他们没有说出这些词并不意味着暗示不存在.在数字上不可能在base-2数字系统中用小于16位的任何东西表示[-32767,32767],并且C不能移植到任何不是base-2数字系统的东西. (3认同)
  • @ElderBug我在调用16位时找不到任何内容,但它的指定范围是16位.我修改了我的答案. (2认同)

Kei*_*son 7

据我了解,C规范说该类型int应该是目标平台上包含至少16位的最有效类型.

以下是标准实际所说的内容int:(N1570草案,第6.2.5节,第5段):

A"普通" int对象具有由执行环境(足够大以包含在范围内的任何值的体系结构建议的大小INT_MIN,以INT_MAX如在标头中定义<limits.h>).

提及INT_MININT_MAX可能略有误导; 这些值是根据类型的特征选择的int,而不是相反的.

而那句" 自然大小"也有些误导.根据目标体系结构,整数类型可能不只有一个"自然"大小.

在其他地方,标准说INT_MIN必须至多-32767,并且INT_MAX必须至少+32767,这意味着int至少16位.

这是标准所说的int_fast16_t(7.20.1.3):

以下每种类型都指定一个整数类型,该类型通常在具有至少指定宽度的所有整数类型中运行最快.

用脚注:

指定类型不能保证最快用于所有目的; 如果实现没有明确的理由选择一种类型而不是另一种类型,它将简单地选择一些满足符号和宽度要求的整数类型.

要求intint_fast16_t相似但不完全相同 - 而且它们同样含糊不清.

在实践中,int通常基于除"自然尺寸"之外的标准来选择尺寸 - 或者为了方便而解释该短语.通常int选择新架构的大小以匹配现有架构的大小,以最小化移植代码的难度.并有一个相当强大的动力,使int不超过32位更宽,使种类char,short以及int可以覆盖的8位,16位和32位的大小.在64位系统上,特别是x86-64,"自然"大小可能是64位,但大多数C编译器使用int32位而不是64位(有些编译器甚至long只能生成32位).

int_fast16_t我怀疑,基础类型的选择较少依赖于这些考虑,因为任何使用它的代码都明确要求快速的16位有符号整数类型.许多现有代码对其特性做出int了超出标准保证的假设,并且编译器开发人员必须满足这些代码,如果他们想要使用它们的编译器.