uint16

义项:16位无符号整数类型
uint16

uint16是计算机中一种宽度为16位的无符号整数类型,只能表示非负整数,取值范围为0至65535。它在C语言的stdint.h头文件中以uint16_t的定宽类型名出现,也被MATLAB、NumPy等数值环境用作数据类型名称。由于其恰好覆盖2字节,uint16常用于表示端口号、像素亮度与传感器采样值等数据。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

uint16指一种宽度固定为16位、不携带符号位的整数数据类型,其全部16个二进制位都用于表示数值大小,因此可表示的整数从0开始,最大到65535[1]。在C语言的标准头文件stdint.h中,对应名字写作uint16_t,其中的N表示该类型的位宽,标准规定其能存放[0, UINT16_MAX]区间内的值[2]。

该类型占2个字节的存储空间,数值上限65535也常以宏UINT16_MAX的形式定义在头文件中[3]。把它与同宽度的int16相比,两者位宽相同,但int16需要留出1位作符号位,正数上限只有32767[1]。

原理

16位无符号整数的取值可以写成以2为底的多项式:$v = \sum_{i=0}^{15} b_i \cdot 2^i$,其中$b_i$为第$i$位的取值0或1,全部位为1时得到最大值$2^{16}-1 = 65535$。由于不存在符号位,这种编码是直接的二进制计数,没有正负号与补码的处理环节。

运算方面,无符号整数在达到表示上限后不会报错,而是按模$2^{16}$回绕:65535加1得到0,0减1得到65535[4]。这种回绕行为源自C语言对无符号运算的规定,NumPy等基于C实现的库也沿用了同样的语义[5]。下图描述一个16位单元中数值的表示与越界处理:


flowchart LR

A[输入数值] --> B{是否在 0 到 65535}

B -- 是 --> C[按 16 位二进制存储]

B -- 否 --> D[对 2^16 取模后回绕]

D --> C

发展历程

在C语言早期,short、int等基本类型的具体位宽由编译器实现决定,标准只规定最小值范围,跨平台代码难以保证某个类型恰好是16位[6]。为改变这一状况,ISO/IEC 9899:1999即C99标准引入了stdint.h与inttypes.h等头文件,把位宽精确的整数类型纳入标准化,uint16_t即在其中[7]。

微软的C++/CX文档中也列出uint16这一名称,将其对应到标准C++的无符号短整型[1]。数值计算环境同样采用该名称,MATLAB把uint16作为一种数据类型,占2个字节、16位,并提供同名转换函数[8]。

应用

网络通信是uint16的典型用途。TCP/IP中的端口号被定义为16位无符号量,头文件netinet/in.h中的in_port_t就等价于uint16_t。端口在协议中按网络字节序存放,与主机内uint16的原生字节序可能相反,因此需要htons一类函数做转换[9]。

在数值计算与数据处理中,uint16常用于存储取值范围有限而数据量大的量。MATLAB可用zeros(100,'uint16')直接生成uint16类型的矩阵,从而以每元素2字节的开销保存数据[10]。16位深度正是许多图像与传感器采样的位宽,用该类型保存这类数据可在精度与内存之间取得平衡。

局限

位宽固定带来的首要限制是数值范围有限,超过65535的正数无法表示。C99中的定宽类型在硬件不支持时并非强制存在,其可用性取决于目标平台。此外,与位宽由实现决定的基本类型相比,定宽类型要求编译器明确支持,一些早期的编译器对C99相关特性支持并不完整[11]。

回绕语义也会带来隐蔽的错误:结果超出范围时程序不会自动告警,而是静默按模取余,65536变0、-1变65535,容易造成数据失真且难排查[12]。从浮点数转换为uint16时,若未先行裁剪,越界值同样会被回绕处理而非饱和截断[12]。因此涉及减法、累加的场景通常需要改用更宽的类型,或先做范围检查[4]。

参见

  • int16 —— 同为16位宽但带符号的整数类型,正数上限为主角的一半。

  • uint8 —— 8位无符号整数类型,常与uint16在数据宽度上相邻使用。

  • uint32 —— 32位无符号整数类型,用于容纳超出uint16范围的数值。

  • 字节序 —— 决定uint16的多字节在内存与网络中如何排列。

  • 补码 —— 有符号整数编码方式,可与无符号类型的表示对照理解。

  • C99 —— 首次在标准中规定定宽整数类型名的语言标准版本。

参考资料

  1. 基本类型 (C++/CX) [引用日期2026-10-29]
  2. kernel.org 上的网页 [引用日期2026-10-29]
  3. builtin/stdint.h - chromiumos/platform/ec.git [引用日期2026-10-29]
  4. NumPy 标量 dtype 深度解析:uint16 溢出机制与类型转换 [引用日期2026-10-29]
  5. timeline [引用日期2026-10-29]
  6. 问在64位处理器的情况下,uint16_t和无符号短整型有什么不同?EN [引用日期2026-10-29]
  7. C 的历史 [引用日期2026-10-29]
  8. uint16 [引用日期2026-10-29]
  9. class IpPort [引用日期2026-10-29]
  10. uint16 [引用日期2026-10-29]
  11. C99 [引用日期2026-10-29]
  12. 如何安全地将 float64 数组转换为 uint16(避免溢出与数据截断) [引用日期2026-10-29]
词条评价
词条统计

浏览次数:0 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:40:48Z

历史版本

本条目引用的词条
int16 uint8 uint32 字节序 补码 C99