在C中定义16位整数

sar*_*ara 17 c integer 16-bit stdint

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

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

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

typedef short int16_t
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

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

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

mae*_*ics 33

这意味着在您的机器上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)等).某些系统(尤其是嵌入式系统)可能具有不同的类型大小,因此short可能并不总是16位,并且编译器将知道用于该位长度的正确大小.

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


Ada*_*eld 9

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

  • sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  • sizeof(char) == 1(注意:a 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)

你的机器上输入shorttypedef 的事实只意味着机器上 16位.这并不意味着定义在其他人的机器上(或者甚至在同一台机器上的其他编译器上)也是相同的.int16_tshort

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