在64位处理器上,uint16_t和unsigned short int有什么区别?

43

我想使用类型为uint16_t的变量,但由于项目限制无法使用该数据类型。是否可以使用unsigned short int代替uint16_t?我不知道它们之间的区别,请有经验的人解释一下。


你尝试过查找“typedef unsigned short uint16_t”吗? - Ishmeet
@Ishmeet 我没有找到任何关于64位处理器的信息。 - Chinna
@Ishmeet 我正在将代码从一个处理器移植到另一个处理器,我发现它。 - Chinna
3
处理器是64位的并不足以提供足够的信息,重要的是实现在您的平台上的ABI。这因处理器和操作系统而异。事实上,将处理器归类为64位(或非64位)是一个过于简化的概括,在这种情况下并没有什么帮助。 - Jens Gustedt
我曾经为一个编译器不提供'uintXX_t'的平台编写程序。所以我自己写了它们。这很有帮助,虽然不太干净(不知道是否符合C标准)。 - glglgl
2个回答

59

uint16_t是一个无符号的16位整数。

unsigned short int是一个无符号的短整数,但其大小取决于实现。标准只规定它至少为16位(即UINT_MAX的最小值为65535)。在实践中,它通常是16位,但不能保证一定如此。

注意:

  1. 如果您需要使用可移植的无符号16位整数,请使用uint16_t
  2. inttypes.hstdint.h都是C99中引入的。如果您正在使用C89,请定义自己的类型。
  3. 某些实现可能不提供uint16_t(请参见下面的参考资料),但始终可以使用unsigned short int

参考资料:C11(ISO/IEC 9899:201x)§7.20 整数类型

对于实现的每个描述的类型,必须声明该typedef名称并定义相关的宏。相反,对于实现未提供的每个在此处描述的类型,不得声明该typedef名称,也不得定义相关的宏。实现应提供那些被描述为“必需”的类型,但不需要提供任何其他类型(描述为“可选”)。


1
原则上,一些实现(和ABI)可能具有非16位的shorts。实际上,所有通常的64位处理器和ABI(x86-64、Sparc 64、PowerPC 64、Aarch 64)都有16位的shorts。但是,int通常是32位的。 - Basile Starynkevitch
1
我也从未见过一台64位机器有32位的short。 - Casey
2
顺便提一下,考虑一种实现方式,其中short int大于16位且CHAR_BIT为8(几乎总是如此),那么根据我所知,定义uint16_t将会是不可能的 - mtvec
@Job 这并非不可能。编译器可能会提供类似 __uint16_t 的扩展,而 stdint.h 可能包含 typedef __uint16_t uint16_t - glglgl
1
@glglgl:你说得对,我没有考虑到扩展整数类型。 - mtvec

23

uint16_t是保证为一个无符号的、占16位的整数。

unsigned short int保证为一个无符号的short integer,而short integer则由你所使用的编译器(以及可能的编译器标志)定义。对于大多数x86硬件的编译器来说,short integer占16位。

另外需要注意的是,根据ANSI C标准,只定义了最小为16位的大小,最大大小取决于编译器开发者。

最小类型限制

任何符合标准的编译器都必须遵守以下关于特定类型可接受值范围的限制。请注意这些是下限:实现可以超过其中的所有或部分。请注意,char类型的最小范围取决于char是否被认为是有符号或无符号的。

类型 最小范围

signed char     -127 to +127
unsigned char      0 to 255
short int     -32767 to +32767
unsigned short int 0 to 65535

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接