21

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

我知道 short 和 int 大小取决于机器。

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

typedef short int16_t

所以我的问题是:

我是否遗漏了什么并且短类型保证 16 位长度?

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

4

4 回答 4

39

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

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

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

如果您在另一个系统上查看该文件stdint.h,则定义可能不同,也可能相同 - 但其目的是提供保证位长度的整数类型的定义。

于 2012-03-21T21:40:38.487 回答
10

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

  • sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  • sizeof(char) == 1(注意:achar仍然可能超过 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)

short在您的机器上进行类型定义的事实仅意味着 aint16_tshort机器上是 16 位。这并不意味着该定义在其他人的机器上是相同的(甚至在您同一台机器上的其他编译上)。

如果包含<stdint.h>,它将int16_t以某种方式定义,保证是带符号的 16 位宽的类型。如果您需要精确大小的整数,请使用那些精确大小的类型。

于 2012-03-21T21:48:17.860 回答
3

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

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

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

于 2012-03-21T21:41:47.053 回答
2

short只保证至少是16-bit宽的。

它可以16-bit在您的系统中很宽,但32-bit在另一个系统中。

于 2012-03-21T21:54:35.953 回答