short 类型
short(或 short int)是 C 语言中较小的整数类型,标准保证至少为 16 位(2 字节),通常就是 16 位。它适合存储范围有限的数据,可以在大规模数组或嵌入式系统中节省内存。
基本用法
short small = 100;
short int same = 100; /* 等价 */
printf("sizeof(short) = %zu\n", sizeof(short)); /* 通常是 2 */
16 位 short 的取值范围:
#include <limits.h>
printf("SHRT_MIN = %d\n", SHRT_MIN); /* -32768 */
printf("SHRT_MAX = %d\n", SHRT_MAX); /* 32767 */
unsigned short 的范围为 0 到 65535:
unsigned short us = 60000; /* 合法:0 到 65535 */
printf("USHRT_MAX = %u\n", USHRT_MAX); /* 65535 */
内存优化
short 适合存储范围有限的数据,可以节省内存。在嵌入式系统或大规模数组中,使用 short 代替 int 能将内存占用减半:
/* 存储 10000 个温度值,范围 -50 到 50 */
short temperatures[10000]; /* 20 KB */
int temperatures[10000]; /* 40 KB */
格式化输入输出
short 在传递给 printf 时会自动提升为 int,因此使用 %d:
short s = 100;
printf("%d\n", s); /* 正确:short 提升为 int 传递 */
unsigned short us = 60000;
printf("%u\n", us); /* 正确:unsigned short 提升为 unsigned int */
如果需要通过 scanf 读取 short,使用 %hd:
short s;
scanf("%hd", &s);
无符号版本
默认情况下 short 是有符号的(可以表示负数)。加 unsigned 修饰后,只表示非负数,但正数范围扩大一倍:
unsigned short us = 60000; /* 合法:0 到 65535 */
printf("USHRT_MAX = %u\n", USHRT_MAX); /* 65535 */
常见错误
溢出:
short a = 30000;
short b = 30000;
short c = a + b; /* 溢出!60000 > 32767 */
printf("%d\n", c); /* 输出 -5536(有符号溢出是未定义行为) */
过度优化类型大小可能导致溢出。在使用 short 前,务必确认数据范围不会超过 ±32767。
无符号类型的陷阱:混合运算时,有符号数会被隐式转换为无符号:
unsigned short u = 10;
short s = -5;
if (s < u)
printf("s < u\n"); /* 可能不会输出! */
/* -5 被转换为很大的无符号数 */