C语言short类型该怎么用?

99ANYc3cd6
预计阅读时长 16 分钟
位置: 首页 C语言 正文

short 是 C 语言中的一个基本数据类型,它的全称是“短整型”,它的主要目的是为了节省内存,当你确定一个变量的值不会很大,不需要使用标准的 int 类型那么大的范围时,就可以使用 short

c语言short怎么用
(图片来源网络,侵删)

short 是什么?

short 是一种整数类型,用于存储整数值,它与 intlonglong long 等同属整型家族。

核心特点:内存占用小

short 的核心优势在于它占用的内存空间通常比 int 小。

  • 在大多数现代系统(如 64 位 Windows、Linux、macOS)上:
    • int 占用 4 字节 (32 位)
    • short 占用 2 字节 (16 位)

这意味着,当你有大量需要存储的小整数时(一个游戏中的坐标、一个数组索引),使用 short 可以显著减少内存占用。

取值范围受限

因为占用的位数少,short 能表示的整数范围也小得多。

c语言short怎么用
(图片来源网络,侵删)

对于一个有符号short(可以存储正数和负数):

  • 位数:16 位
  • 范围:-32,768 到 32,767 (即 -2¹⁵ 到 2¹⁵ - 1)

对于一个无符号short(只能存储非负数):

  • 位数:16 位
  • 范围:0 到 65,535 (即 0 到 2¹⁶ - 1)

注意short 的确切大小和范围是由 C 标准规定的,但具体实现(编译器和目标平台)可能有所不同,标准只保证 short 的长度不超过 int 的长度,在几乎所有的现代平台上,short 都是 16 位。


如何声明和使用 short

声明 short 变量非常简单,直接使用 short 关键字。

c语言short怎么用
(图片来源网络,侵删)

基本声明和赋值

#include <stdio.h>
int main() {
    // 声明一个有符号的 short 变量
    short s_num = 100;
    printf("有符号 short s_num = %d\n", s_num); // %d 是打印有符号整数的格式
    // 声明一个无符号的 short 变量
    unsigned short us_num = 50000;
    printf("无符号 short us_num = %u\n", us_num); // %u 是打印无符号整数的格式
    return 0;
}

超出范围的后果(非常重要!)

如果你给 short 变量赋一个超出其范围的值,会发生“整数溢出” (Integer Overflow),程序不会报错,但数值会“回绕”,得到一个意想不到的结果。

#include <stdio.h>
int main() {
    short max_short = 32767; // short 的最大正值
    printf("最大值: %d\n", max_short);
    // 加 1,会溢出
    max_short = max_short + 1;
    printf("加 1 后: %d\n", max_short); // 输出会是 -32768
    // 继续加
    max_short = max_short + 1;
    printf("再加 1 后: %d\n", max_short); // 输出会是 -32767
    // 无符号的例子
    unsigned short max_ushort = 65535; // unsigned short 的最大值
    printf("无符号最大值: %u\n", max_ushort);
    // 加 1,会溢出
    max_ushort = max_ushort + 1;
    printf("无符号加 1 后: %u\n", max_ushort); // 输出会是 0
    return 0;
}

运行结果:

最大值: 32767
加 1 后: -32768
再加 1 后: -32767
无符号最大值: 65535
无符号加 1 后: 0

这个特性是 C 语言中一个常见的陷阱,需要特别注意。


shortintlong 的关系

理解它们之间的关系很重要。

类型 典型大小 (字节) 典型范围 (有符号) 特点
short 2 -32,768 到 32,767 内存占用小,范围小
int 4 -2,147,483,648 到 2,147,483,647 最常用的整数类型,性能通常最优
long 4 或 8 4字节时同 int,8字节时范围更大 在 64 位系统上通常是 8 字节
long long 8 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 范围最大的标准整数类型

核心规则:

  1. sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  2. int 是系统“最自然”的整数大小,通常运算速度最快。
  3. 除非有特殊需求(如节省内存或处理特定硬件接口),否则优先使用 int

什么时候应该使用 short

short 并不常用,但在以下场景下非常有用:

  1. 内存敏感的应用

    • 当你需要存储数百万个整数时,例如在图像处理(每个像素的坐标)、大型数组或数据结构中,使用 short 可以将内存占用减少一半。

    • 示例:存储一个 1024x1024 的二维坐标数组。

      // 使用 int: 1024 * 1024 * 4 bytes = 4 MB
      int coordinates_int[1024][1024];
      // 使用 short: 1024 * 1024 * 2 bytes = 2 MB (节省了一半内存)
      short coordinates_short[1024][1024];
  2. 与硬件或文件格式交互

    • 某些硬件寄存器、网络协议头或文件格式(如旧的 BMP 图像文件)可能明确要求使用 16 位整数,在这种情况下,必须使用 shortuint16_t 来保证数据格式正确。
  3. 嵌入式系统开发

    • 在资源极其受限的微控制器上,内存非常宝贵,每一字节都至关重要,使用 short 是常态。

shortint 的转换

shortint 混合运算时,C 语言会进行“整数提升” (Integer Promotion)

规则是:short 会被自动转换为 int(前提是 int 能容纳 short 的所有值,这在现代系统中总是成立)。

#include <stdio.h>
int main() {
    short s = 100;
    int i = 20000;
    long result;
    // s 会被自动提升为 int,然后与 i 相加
    // 最终结果 (int) 会被赋值给 result (long)
    result = s + i;
    printf("s = %hd, i = %d\n", s, i); // %hd 用于打印 short
    printf("result = %ld\n", result);   // %ld 用于打印 long
    return 0;
}

在这个例子中,你不需要手动进行类型转换,编译器会自动处理,这保证了运算的精度,但也意味着 short 的“节省内存”优势在参与运算时会暂时消失。


更好的选择:<stdint.h> 中的固定宽度整数类型

现代 C 编程(特别是 C99 标准之后)更推荐使用 <stdint.h> 头文件中定义的类型,而不是 shortlong 这些依赖于平台的大小不定的类型。

  • int16_t: 一个正好 16 位的 signed 整型。
  • uint16_t: 一个正好 16 位的 unsigned 整型。
  • int32_t: 一个正好 32 位的 signed 整型。
  • uint32_t: 一个正好 32 位的 unsigned 整型。

为什么更好? 因为它们的大小是明确且固定的,不依赖于你使用的编译器或操作系统,这让你的代码更具可移植性。

#include <stdio.h>
#include <stdint.h> // 必须包含这个头文件
int main() {
    // 使用固定宽度类型,代码意图更清晰,可移植性更好
    int16_t my_small_num = 30000;
    uint16_t my_unsigned_small_num = 40000;
    printf("int16_t: %d\n", my_small_num);
    printf("uint16_t: %u\n", my_unsigned_small_num);
    return 0;
}

  • short:一个传统的、大小可能不固定的 16 位左右整数类型。
  • 何时用:当你明确需要节省内存,并且目标平台上的 short 大小符合预期时。
  • 何时不用:在绝大多数通用应用程序中,优先使用 int
  • 最佳实践:当需要特定大小的整数(如 16 位)时,优先使用 <stdint.h> 中的 int16_tuint16_t,它们更清晰、更安全、更具可移植性。
-- 展开阅读全文 --
头像
C语言rand函数源码如何实现随机数生成?
« 上一篇 今天
织梦默认数据库文件存放在哪里?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]