我想到的两个用例short
会浮现在脑海中:
在第一种情况下,由于int
保证至少为16位且是最有效的整数数据类型,我将使用int
。在第二种情况下,由于标准不保证short
的大小恰好是16位,我会使用int16_t
代替。那么什么用途很短?
答案 0 :(得分:8)
在C99环境中使用short
从来没有理由使用16位整数;您可以改用int16_t
,int_fast16_t
或int_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)
如果你有一个非常大的阵列,你可能想要使用短裤。
您可能会发现它们可以作为联盟的一部分挑选出其他一些数据。