10

我会想到两个用例short

  1. 我想要一个至少 16 位大小的整数类型
  2. 我想要一个大小正好为 16 位的整数类型

在第一种情况下,由于int保证至少为 16 位并且是最有效的整数数据类型,我会使用int. 在第二种情况下,由于标准不保证short' 的大小正好是 16 位,我会int16_t改用它。那么短有什么用呢?

4

5 回答 5

10

从来没有理由short在具有 16 位整数的 C99 环境中使用。您可以使用int16_t,int_fast16_tint_least16_t代替。

The main reasons for using short is backward compatibility with C89 or older environments, which do not offer these types, or with libraries using short as part of their public API, for implementing <stdint.h> itself, or for compatibility with platforms that do not have 16-bit integers so their C compilers do not provide int16_t.

于 2012-04-20T23:01:09.273 回答
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 中。但是,我相信对于大多数编译器,即使是像 MS Visual C 这样的不声称支持 C99 的编译器,这些头文件也可以以某种形式或形式使用。

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

§7.18.1.1 精确宽度整数类型

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

¶2 typedef 名称uintN_t表示宽度为 N 的无符号整数类型。因此, uint24_t表示宽度正好为 24 位的无符号整数类型。

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

于 2012-04-20T22:59:49.873 回答
1

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

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

于 2012-04-20T22:55:47.423 回答
0

ANSI C 指定类型的最小值范围。您只能确定第一种情况;不是第二个。

于 2012-04-20T22:55:51.927 回答
0

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

您可能会发现它们对于挑选其他一些数据作为联合的一部分很有用。

于 2012-04-20T22:56:59.493 回答