我需要在C中声明一个16位大小的整数。
我知道short和int大小与机器有关。
我尝试使用"stdint.h",
,但似乎只是做了
typedef short int16_t
所以我的问题是:
我错过了什么,短类型保证16位长度?
如果不是,是否有替代方案可以保证呢?
答案 0 :(得分:33)
这意味着int16_t
在您的计算机上定义为short
,而不是所有计算机。
只需使用绝对需要16位整数类型的int16_t
;它将在提供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
,定义可能会有所不同,或者它们可能相同 - 但其目的是为保证位长度的整数类型提供定义。
答案 1 :(得分:9)
不,short
不保证16位长度。关于基本整数数据类型的唯一保证是:
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
sizeof(char) == 1
(注意:char
仍可能超过8位!)SHRT_MIN <= -32767
和SHRT_MAX >= 32767
(暗示short
至少为16位)INT_MIN <= -32767
和INT_MAX >= 32767
(暗示int
至少为16位)LONG_MIN <= -2147483647
和LONG_MAX >= 2147483647
(暗示long
至少为32位)LLONG_MIN <= -9223372036854775807
和LLONG_MAX >= 9223372036854775807
(暗示long long
至少为64位)(C99§5.2.4.2.1和附件E)
short
在 计算机上对int16_t
进行了typedef这一事实意味着你的<{1}}是16位em>机器。这并不意味着定义在其他人的机器上是相同的(甚至在同一台机器上的其他编译器上)。
如果你包含short
,它将以某种方式定义<stdint.h>
,保证是一个有符号和16位宽的类型。如果您需要精确大小的整数,请使用那些精确大小的类型。
答案 2 :(得分:3)
每台机器可能有也可能没有这些定义。
唯一真正的安全方式是通过配置检查或其他方式。
但是如果int16_t存在(并且configure找到它),那么它应该是短路确实为16位的机器上的短路。如果short是不同的大小,那么该系统会将int16_t定义为其他东西。 IE,如果int16_t可用,你可以放心地假设它长2个字节。
答案 3 :(得分:2)
short
仅保证至少16-bit
宽。
您的系统可以16-bit
宽,但另一个系统可以32-bit
。