在C中定义16位整数

我需要在C中声明一个大小为16位的整数。

我知道short和int size是依赖于机器的。

我试图使用"stdint.h",但似乎他们只是这样做

 typedef short int16_t 

所以我的问题是:

我错过了什么,短型保证16位长度?

如果不是,是否有替代方案可以保证呢?

这意味着int16_t您的机器上定义为short ,而不是所有机器。

只需使用int16_t ,你绝对需要一个16位整数类型; 它将在提供stdint.h所有平台上定义为适当的(它应该是支持C99的所有平台,或者是C ++的cstdint )。

[编辑]为了澄清,“ stdint.h ”头文件由C(或C ++)编译器提供,因此其内容可能因编译器,版本,系统,CPU体系结构等而异。即,作者编译器套件确切地知道哪些类型在哪个系统上有什么尺寸。 仅在一个系统上查看该文件只会告诉您特定体系结构上特定操作系统上特定版本的特定版本的定义(例如,Darwin x86_64上的GCC 4.2,WinNT Alpha上的Visual Studio或Solaris IA32上的ICC)等)。 某些系统(尤其是嵌入式系统)可能具有不同的类型大小,因此short可能并不总是16位,并且编译器将知道用于该位长度的正确大小。

如果查看另一个系统上的stdint.h文件,定义可能会有所不同,或者它们可能相同 – 但其目的是为保证位长度的整数类型提供定义。

不, short不保证16位长度。 关于基本整数数据类型的唯一保证是:

  • sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  • sizeof(char) == 1 (注意: char仍然可以超过8位!)
  • SHRT_MIN <= -32767SHRT_MAX >= 32767 (暗示short是至少16位)
  • INT_MIN <= -32767INT_MAX >= 32767 (暗示int至少为16位)
  • LONG_MIN <= -2147483647LONG_MAX >= 2147483647 (暗示long至少为32位)
  • LLONG_MIN <= -9223372036854775807LLONG_MAX >= 9223372036854775807 (暗示long long至少为64位)

(C99§5.2.4.2.1和附件E)

你的机器int16_t short int16_tint16_t这一事实意味着机器上的short为16位。 这并不意味着该定义在其他人的机器上(或者甚至在同一台机器上的其他编译器上)也是相同的。

如果包含 ,它将以某种方式定义int16_t ,它保证是一个有符号且16位宽的类型。 如果需要精确大小的整数,请使用精确大小的类型。

每台机器可能有也可能没有这些定义。

唯一真正安全的方法是通过配置检查或其他方式。

但是如果int16_t存在(并且configure找到它)那么它应该是一个短的机器,其中short确实是16位。 如果short是不同的大小,那么该系统会将int16_t定义为其他东西。 IE,如果int16_t可用,你可以放心地假设它长2个字节。

short只能保证至少16-bit位宽。

它可以在系统中为16-bit位宽,但在另一个系统中为32-bit