我会想到两个用例short
:
- 我想要一个至少 16 位大小的整数类型
- 我想要一个大小正好为 16 位的整数类型
在第一种情况下,由于int
保证至少为 16 位并且是最有效的整数数据类型,我会使用int
. 在第二种情况下,由于标准不保证short
' 的大小正好是 16 位,我会int16_t
改用它。那么短有什么用呢?
我会想到两个用例short
:
在第一种情况下,由于int
保证至少为 16 位并且是最有效的整数数据类型,我会使用int
. 在第二种情况下,由于标准不保证short
' 的大小正好是 16 位,我会int16_t
改用它。那么短有什么用呢?
从来没有理由short
在具有 16 位整数的 C99 环境中使用。您可以使用int16_t
,int_fast16_t
或int_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
.
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 名称
int
N_t
指定宽度为 N、无填充位和二进制补码表示的有符号整数类型。因此,int8_t
表示宽度正好为 8 位的有符号整数类型。¶2 typedef 名称
uint
N_t
表示宽度为 N 的无符号整数类型。因此,uint24_t
表示宽度正好为 24 位的无符号整数类型。¶3 这些类型是可选的。但是,如果实现提供了宽度为 8、16、32 或 64 位的整数类型,则应定义相应的 typedef 名称。
是的,如果你真的想要一个特定的数据大小,你可以使用 int16_t、int32_t 等。
int16_t 通常是来自 short 的特定于平台的 typedef(或任何映射到 16 位的类型)。在 32 位机器上,int16_t 可以 typedef'd as short,在 16 位机器上 int16_t 可以 typedef 为 int。
ANSI C 指定类型的最小值范围。您只能确定第一种情况;不是第二个。
如果你有一个非常大的数组,你可能想要使用短裤。
您可能会发现它们对于挑选其他一些数据作为联合的一部分很有用。