何时使用short而不是int?

时间:2012-04-20 22:49:17

标签: c

我想到的两个用例short会浮现在脑海中:

  1. 我想要一个大小至少为16位的整数类型
  2. 我想要一个大小恰好是16位的整数类型
  3. 在第一种情况下,由于int保证至少为16位且是最有效的整数数据类型,我将使用int。在第二种情况下,由于标准不保证short的大小恰好是16位,我会使用int16_t代替。那么什么用途很短?

5 个答案:

答案 0 :(得分:8)

在C99环境中使用short从来没有理由使用16位整数;您可以改用int16_tint_fast16_tint_least16_t

使用short的主要原因是向后兼容C89或较旧的环境,这些环境不提供这些类型,或者使用short作为其公共API的一部分的库,用于实现{{1}本身,或者与没有16位整数的平台兼容,因此他们的C编译器不提供<stdint.h>

答案 1 :(得分:3)

ISO / IEC 9899:1999(C99)添加了提供您所需内容的标题<stdint.h><inttypes.h>

  • int16_t可能未定义,但如果实现中存在16位(完全)整数类型,则int16_t将成为它的别名。
  • int_least16_t是一种类型,它至少包含16位。它始终可用。
  • int_fast16_t是保存至少16位的最快类型。它始终可用。

与其他尺寸类似:8,16,32,64。

最大精度整数类型也有intmax_t。当然,每个都有一个无符号类型:uint16_t等。

这些类型也出现在C2011中。它们不存在于C89或C90中。但是,我相信大多数编译器都可以使用某些形状或形式的标题,甚至是那些声称不支持C99的MS Visual C。

请注意,我已经提供了<stdint.h><inttypes.h>标头的POSIX 2008版本的链接。 POSIX对C标准没有实施规则:

  

§7.18.1.1精确宽度整数类型

     

¶1typedef名称int N _t指定带宽为N的有符号整数类型,无填充   位和二进制补码表示。因此,int8_t表示有符号整数   类型,宽度恰好为8位。

     

¶2typedef名称uint N _t指定宽度为N的无符号整数类型。因此,   uint24_t表示无符号整数类型,宽度恰好为24位。

     

¶3这些类型是可选的。但是,如果实现提供了整数类型   宽度为8,16,32或64位,它应定义相应的typedef名称。

答案 2 :(得分:1)

是的,如果你真的想要一个特定的数据大小,你可以使用int16_t,int32_t等。

int16_t通常是一个特定于平台的typedef,从short(或任何映射到16位)。在32位机器上,int16_t可以是typedef'd为short,在16位机器上int16_t可以是typedef为int。

答案 3 :(得分:0)

ANSI C指定类型的最小值范围。你只能确定第一个案例;不是第二个。

答案 4 :(得分:0)

如果你有一个非常大的阵列,你可能想要使用短裤。

您可能会发现它们可以作为联盟的一部分挑选出其他一些数据。