当前位置: 首页 > news >正文

13 数据存储单位与 C 语言整数类型:从位到艾字节、常见整数类型及其范围、字面量后缀、精确宽度类型详解

1 数据存储单位

        在计算机科学领域,数据存储采用分层级的单位体系,各层级单位以 2 的幂次方为换算基础,而非传统数学中的 10 的幂次方

        以下是常见的数据存储单位介绍:

  • 位(bit,b)是计算机中的最小存储单位,它仅能表示一个二进制位,即 0 或 1。这是计算机处理数据的基础,所有的信息在计算机中最终都以二进制位的形式存在。
  • 字节(Byte,B)是计算机中的基本存储单元,由 8 个二进制位组成,即 1 Byte = 8 bit。它是衡量数据量的基本单位,在文件存储、数据传输等方面广泛应用。
  • 千字节(Kilobyte,KB)是字节的上一级单位,1 KB = 1024 Bytes。在日常使用中,KB 常用于表示较小的文件大小,如简单的文本文件、小型图片等,也可用于衡量内存使用量。
  • 兆字节(Megabyte,MB)是比千字节更大的数据存储单位,1 MB = 1024 KB。它常用于描述中等规模的文件大小,例如软件安装包、常见的音乐文件、标清视频文件等。
  • 吉字节(Gigabyte,GB)是更大的数据存储单位,1 GB = 1024 MB。在存储设备领域,GB 常用于衡量硬盘驱动器、固态硬盘、USB 闪存盘等的存储容量;在文件方面,常用于描述大型软件、高清视频等的大小。
  • 太字节(Terabyte,TB)是更大一级的数据存储单位,1 TB = 1024 GB。TB 级别的存储通常应用于企业级存储解决方案、数据中心,以满足大量数据的存储需求,同时也适用于个人用户进行大量数据备份。
  • 拍字节(Petabyte,PB)是更为庞大的数据存储单位,1 PB = 1024 TB。它主要用于超大规模的数据中心、云计算平台以及大数据分析等领域,这些领域需要处理和存储海量的数据。
  • 艾字节(Exabyte,EB)是目前常见的数据存储单位中最大的,1 EB = 1024 PB。EB 级别的存储主要用于应对超大规模的数据存储需求,例如全球互联网数据的存储、大型科研项目产生的大量数据存储等。

2 C 语言数据类型概述

        程序的核心功能在于对数据进行计算与处理,而为了更高效地管理这些数据,我们常对其进行分类。以容器为例,依据其容量和形状的差异,我们可以将其划分为大杯、中杯、大碗、小碗等不同类别。每种容器都有其独特的设计,适合盛装不同的物品。如下图所示,我们可以看到各种形状和大小的容器,它们各自具有不同的用途和容量。这种分类方式不仅有助于我们更好地理解和组织数据,还能在实际应用中提高效率和便利性。

        C 语言依据数据的特性和用途,对其进行了精细的类型划分。不同类型的数据在内存中会占用不同大小的存储空间,这种设计使得程序能够更高效地管理和利用内存资源。


3 整数类型

3.1 基本概念

        整数类型,简称整型,是用于存储整数值的数据类型,例如:12、30、3456 等。

3.2 常见整型类型及范围

        在 C 语言中,整型数据可以根据其存储空间大小和取值范围进一步细分。以下是常见的整型类型及其对应的存储大小与取值范围:

类型存储大小值范围
short
    signed short2 字节-32,768 (-2^15) 到 32,767 (2^15 - 1)
    unsigned short2 字节0 到 65,535 (2^16 - 1)
int
    signed int16 位系统:2 字节
32 位系统:4 字节
16 位:-32,768 (-2^15) 到 32,767 (2^15 - 1)
32 位:-2,147,483,648 (-2^31) 到 2,147,483,647 (2^31 - 1)
    unsigned int16 位系统:2 字节
32 位系统:4 字节
16 位:0 到 65,535 (2^16 - 1)
32 位:0 到 4,294,967,295 (2^32 - 1)
long
    signed long32 位系统:4 字节
64 位系统:8 字节
32 位:-2,147,483,648 (-2^31) 到 2,147,483,647 (2^31 - 1)
64 位:-9,223,372,036,854,775,808 (-2^63) 到 9,223,372,036,854,775,807 (2^63 - 1)
    unsigned long4 或 8 字节32 位:0 到 4,294,967,295 (2^32 - 1)
64 位:0 到 18,446,744,073,709,551,615 (2^64 - 1)
long long
    signed long long8 字节

-9,223,372,036,854,775,808 (-2^63) 到 9,223,372,036,854,775,807 (2^63 - 1)

    unsigned long long8 字节0 到 18,446,744,073,709,551,615 (2^64 - 1)

3.3 整型类型注意事项

3.3.1 存储大小

        整型类型的存储大小受操作系统、编译器和硬件平台的共同影响,因此在不同环境下可能会有所不同。例如,在某些平台上,long 和 int 的大小可能相同,但这种假设并不具有通用性,不能依赖于此。

        为了确保程序的可移植性,可以使用 sizeof 运算符(将在后续学习中详细讲解)来确定具体平台上的类型大小。通过这种方式,可以在不同环境中准确了解变量占用的内存空间。

3.3.2 符号类型

        整型分为有符号(signed)和无符号(unsigned)两种

  1. 有符号类型(signed):可以表示正数、负数和零,适用于需要处理负值的场景。

  2. 无符号类型(unsigned):只能表示非负整数(即零和正数),适用于仅需处理正值的情况。

        在 C 语言中,默认情况下整型为有符号类型。例如,int 等价于 signed int,因此可以省略 signed 关键字直接写作 int。如果需要使用无符号类型,则必须显式声明为 unsigned

3.3.3 类型选择

        根据实际需求合理选择整型类型,可以在性能、内存占用和兼容性之间取得平衡:

  • 节省空间:当数据范围较小时,可以选择 short 类型(如计数器、小范围数值)。
  • 通用场景:优先使用 int 类型,因为它在大多数平台上具有良好的性能与兼容性,适合大多数常规应用场景。
  • 大数需求:当需要处理较大数值时,应选择 long long 类型(如文件大小、高精度计算等场景)。

3.4 多种整数类型设计原因

        C 语言提供多种整数类型(如 short、int、long、long long 及其 signed/unsigned 变体),其设计初衷是为了满足多样化的编程需求,同时兼顾性能、可移植性和代码安全性。以下是这些类型设计背后的核心原因及其详细分析。

3.4.1 适配硬件差异

        不同硬件平台的存储能力、字长(word size)和性能特性各不相同,C 语言通过提供多种整数类型,使代码能够高效适配不同硬件环境。

  • 高性能计算场景:在需要处理大数或高精度计算的场景中(如科学计算、金融建模),long long 类型(通常为 64 位)提供了更大的数值范围(-2^63 到 2^63 - 1),避免了溢出问题,同时利用现代 64 位处理器的原生支持提升计算效率。
  • 嵌入式系统场景:在资源受限的嵌入式设备(如微控制器)中,short 类型(通常为 16 位)通过减少内存占用(相比 int 或 long),降低了硬件资源需求,从而延长电池寿命或降低硬件成本。
  • 跨平台兼容性:不同硬件平台的字长可能不同(如 16 位、32 位、64 位),C 语言通过提供多种类型,使程序员能够根据目标平台的特性选择合适的类型,确保代码在不同硬件上均能高效运行。

3.4.2 满足数值范围需求

        C 语言通过类型大小区分数值范围,为不同应用场景提供了灵活的选择。

  • 无符号类型的扩展性:unsigned 类型通过移除符号位,将数值范围扩展至非负数(如 unsigned int 的范围为 0 到 2^32 - 1),适用于以下场景:

    • 计数器:循环计数器通常无需负数,使用 unsigned 类型可避免溢出问题。
    • 位操作:无符号类型与位掩码操作天然兼容,简化了位级编程。
    • 数组索引:索引值始终为非负数,使用 unsigned 类型可避免负值错误
  • 大范围数值处理:long long 类型(64 位)适用于需要处理大范围整数的场景(如文件大小、时间戳、大数运算),其数值范围远超 int 或 long,避免了溢出风险。

  • 小范围数值优化:short 类型(16 位)适用于数值范围较小的场景(如状态码、布尔值集合),通过减少内存占用提升性能。

3.4.3 提升可移植性与兼容性

        C 语言的设计目标是跨平台通用性,多种整数类型的设计有助于在不同编译器和硬件平台上保持代码的一致性。

  • 最小范围保证:C 标准未强制固定类型大小,但规定了每种类型的最小范围(如 int 至少为 16 位,long 至少为 32 位)。这种灵活性允许编译器根据目标平台优化类型大小,同时确保代码在不同平台上均能正确运行。

  • 历史代码兼容性:保留传统类型(如 long)和未明确大小的类型(如 int)是为了兼容早期 C 代码。许多遗留系统依赖这些类型的默认行为,强制改变可能导致现有代码无法编译或行为异常。

  • 跨平台一致性:通过提供多种类型,程序员可以根据需求显式选择类型(如 int32_t、uint64_t),避免因平台差异导致的隐式行为变化,提升代码的可维护性。

3.4.4 优化性能与代码明确性

        C 语言通过类型设计优化内存对齐和访问效率,同时减少隐式转换错误,提升代码的安全性和可读性。

  • 硬件对齐优化:现代处理器对特定大小的数据类型(如 4 字节的 int 或 8 字节的 long long)有对齐要求。使用与硬件对齐要求匹配的类型(如 4 字节对齐的 int)可显著提升内存访问速度,减少 CPU 周期浪费

  • 显式类型区分:signed 和 unsigned 类型的显式区分避免了隐式转换错误。例如:

    • 算术运算:无符号类型在溢出时表现为模运算,而有符号类型可能导致未定义行为(后续学习)
    • 比较操作:signed 和 unsigned 类型混合比较可能导致意外结果(如负数被解释为大整数)。
    • 通过显式声明类型,程序员可清晰表达意图,减少潜在错误。
  • 代码可读性与维护性:使用语义明确的类型(如 size_t 表示内存大小,ptrdiff_t 表示指针差值)提升了代码的可读性,使其他开发者能够快速理解变量用途。

3.5 多种整数类型大小比较

        C 语言标准通过定义整数类型的相对大小关系和最小位宽要求,在保证跨平台灵活性和可移植性的同时,为程序员提供了明确的类型选择依据。以下是基于 C99 标准的详细分析:

3.5.1 相对大小关系

        C 语言标准规定了整数类型的相对大小顺序,但未强制固定每种类型的具体位数。这种设计允许编译器根据目标平台的特性优化类型大小,同时确保类型之间的层级关系一致。

层级关系:

        char ≤ short ≤ int ≤ long ≤ long long

  • char:最小整数类型,通常用于存储字符或小范围整数。其大小固定为 1 字节(8 位),但具体表示范围(有符号或无符号)由实现决定。
  • short:至少与 char 一样大,但通常更大(如 16 位)。适用于需要节省内存的小范围整数。
  • int:至少与 short 一样大,通常是编译器默认的高效整数类型(如 32 位)。
  • long:至少与 int 一样大,常用于需要更大范围的整数(如 32 位或 64 位)。
  • long long:至少与 long 一样大,提供最大范围的整数类型(通常为 64 位)。

设计目的:

        层级关系确保了类型之间的兼容性。例如,将 short 赋值给 int 或 long 时不会丢失信息,因为目标类型始终不小于源类型。

3.5.2 最小位宽要求

        C 标准规定了每种整数类型的最小位宽,确保类型在不同平台上具有一致的最小表示能力。

  • 类型最小位宽典型位宽(常见实现)说明
    char8 位8 位固定为 1 字节,用于字符或小整数。
    short16 位16 位至少 16 位,适用于小范围整数。
    int16 位32 位(32/64 位系统)至少 16 位,通常是编译器默认的高效整数类型。
    long32 位32 位(32 位系统)至少 32 位,64 位系统上可能为 64 位(如 Linux x86_64)。
    64 位(64 位系统)
    long long64 位64 位至少 64 位,提供最大范围的整数类型。
  • 灵活性:编译器可根据平台特性调整类型大小(如 int 在 16 位系统可能为 16 位,在 32/64 位系统通常为 32 位)。
  • 一致性:最小位宽保证了类型在不同平台上的基本表示能力(如 long long 始终至少为 64 位)。
  • 性能优化:编译器可选择与目标平台字长对齐的类型(如 32 位系统使用 32 位 int),提升内存访问效率。

3.6 字面量后缀规则

        字面量是源代码中用于直接表示固定值的符号,整数类型的字面量可以通过后缀显式指定其类型

        C 语言提供了一系列后缀,用于将字面量转换为特定的整数类型,从而避免类型推断的歧义并提升代码的可读性和安全性。

3.6.1 默认类型与自动提升

        如果整数字面量没有指定后缀,编译器会根据字面量的值和上下文来推断其类型

  • 通常情况下,如果字面量的值在 int 类型的范围内,它会被视为 int 类型
  • 如果超出 int 的范围但在 long 的范围内,它可能会被提升为 long 类型(具体取决于值的大小和平台实现)。
  • 如果超出 long 的范围,并且在 long long 的范围内,它可能会被提升为 long long 类型(具体取决于值的大小和平台实现)。
int a = 123;  // 123 默认是 int 类型

3.6.2 后缀类型说明

        C 语言通过后缀显式指定字面量的类型,常用后缀及其含义如下:

后缀类型示例说明
int123默认类型,适用于小范围整数。
l/Llong123L表示 long 类型,建议使用大写 L 以避免与数字 1 混
ll/LLlong long123LL表示 long long 类型,适用于大范围整数。
u/Uunsigned int123U表示无符号整数,扩展正数范围。

ul/Ul/uL/UL

lu/Lu/lU/LU

unsigned long123UL无符号 long 类型,后缀顺序无关。

ull/Ull/uLL/ULL

llu/LLu/llU/LLU

unsigned long long123ULL无符号 long long 类型,适用于大范围无符号整数。

3.6.3 后缀使用规则与最佳实践

  • 后缀组合:
    • 无符号后缀(u/U)与长度后缀(l/L、ll/LL)可自由组合,顺序无关。例如:
unsigned long a = 123UL;        // 等价于 123LU
unsigned long long b = 123ULL;  // 等价于 123LLU
unsigned long long b = 123uLL;  // 等价于 123ULL
  • 大小写建议:

    • 使用大写 L 表示 long 类型,避免与小写字母 l(易与数字 1 混淆)混淆
    • 无符号后缀 u 可使用小写,但为保持一致性,也可统一使用大写 U
    • 注意:Ll 或 lL 是非法的,因为标准要求后缀的两个字母必须相同(要么都是大写,要么都是小写)。
  • 避免歧义:

    • 在需要明确类型时,始终使用后缀。例如:

long long largeNumber = 9223372036854775807LL;  // 明确指定 long long 类型
unsigned int bitmask = 0xFFFFFFFFU;            // 明确指定 unsigned int 类型

3.6.4 特殊类型与注意事项

  • unsigned short 无专用后缀:
    • C 语言未提供 unsigned short 的专用后缀。若需表示 unsigned short 类型,可通过显式类型转换
unsigned short value = (unsigned short)12345;
  • 字面量范围限制:
    • 字面量的值必须在其指定类型的表示范围内,否则会导致编译错误或未定义行为
unsigned int x = -1;  // 错误:-1 超出 unsigned int 范围

3.7 格式占位符与整型类型对应关系

3.7.1 格式占位符与类型对照表

        格式占位符用于在格式化输入输出中指定变量的类型,确保数据正确解析和显示。

格式说明符对应的整型类型示例
%hdshortshort a = 123;
%huunsigned shortunsigned short b = 123;
%dintint c = 123;
%uunsigned intunsigned int d = 123;
%ldlonglong e = 123L;
%luunsigned longunsigned long f = 123UL;
%lldlong longlong long g = 123LL;
%lluunsigned long longunsigned long long h = 123ULL;

关键注意事项:

  1. 顺序严格性:格式占位符中的类型修饰符(如 ll、u)必须按固定顺序书写
    • %lld 表示 long long,不能写成 %dll。
    • %llu 表示 unsigned long long,不能写成 %lul。
  2. C99 标准支持
    • long long 类型及其占位符 %lld、%llu 是 C99 标准引入的。
    • 早期 C 标准(如 C89)可能不支持这些占位符,需使用编译器扩展或避免使用 long long。
  3. 字面量后缀灵活性:整数字面量的后缀(如 UL、LU)顺序可互换(123UL 等价于 123LU),但格式占位符必须严格遵守顺序。

3.7.2 示例:格式化输出多种整型数据

#include <stdio.h>int main()
{// short 类型short a1 = 10; // 等同于 signed shortsigned short a2 = -10;unsigned short a3 = 20;printf("short a1=%hd; signed short a2=%hd; unsigned short a3=%hu\n", a1, a2, a3);// 输出: short a1=10; signed short a2=-10; unsigned short a3=20// int 类型int b1 = 100; // 等同于 signed intsigned int b2 = -100;unsigned int b3 = 200u; // 后缀 'u' 表示 unsignedunsigned b4 = 300U;     // 等同于 unsigned intprintf("int b1=%d; signed int b2=%d; unsigned int b3=%u; unsigned b4=%u\n", b1, b2, b3, b4);// 输出: int b1=100; signed int b2=-100; unsigned int b3=200; unsigned b4=300// long 类型long c1 = 1000L; // 推荐大写 'L',避免与数字 1 混淆signed long c2 = -1000L;unsigned long c3 = 2000UL; // 推荐大写 'UL'printf("long c1=%ld; signed long c2=%ld; unsigned long c3=%lu\n", c1, c2, c3);// 输出: long c1=1000; signed long c2=-1000; unsigned long c3=2000// long long 类型(C99 及以后)long long d1 = 10000LL; // 推荐大写 'LL',避免与数字 1 混淆signed long long d2 = -10000LL;unsigned long long d3 = 20000ULL; // 推荐大写 'ULL'printf("long long d1=%lld; signed long long d2=%lld; unsigned long long d3=%llu\n", d1, d2, d3);// 输出: long long d1=10000; signed long long d2=-10000; unsigned long long d3=20000return 0;
}

        程序在 VS code 中的运行结果如下所示:

3.7.3 示例:格式化输入输出多种整型数据

#include <stdio.h>int main()
{// 定义各种整型变量short s;                // 有符号短整型unsigned short us;      // 无符号短整型int i;                  // 有符号整型unsigned int ui;        // 无符号整型long l;                 // 有符号长整型unsigned long ul;       // 无符号长整型long long ll;           // 有符号长长整型(C99 及以后)unsigned long long ull; // 无符号长长整型(C99 及以后)// 输入有符号短整型printf("Enter a short integer: ");scanf("%hd", &s); // 使用 %hd 格式说明符读取 short 类型// 输入无符号短整型printf("Enter an unsigned short integer: ");scanf("%hu", &us); // 使用 %hu 格式说明符读取 unsigned short 类型// 输入有符号整型printf("Enter an integer: ");scanf("%d", &i); // 使用 %d 格式说明符读取 int 类型// 输入无符号整型printf("Enter an unsigned integer: ");scanf("%u", &ui); // 使用 %u 格式说明符读取 unsigned int 类型// 输入有符号长整型printf("Enter a long integer: ");scanf("%ld", &l); // 使用 %ld 格式说明符读取 long 类型// 输入无符号长整型printf("Enter an unsigned long integer: ");scanf("%lu", &ul); // 使用 %lu 格式说明符读取 unsigned long 类型// 输入有符号长长整型printf("Enter a long long integer: ");scanf("%lld", &ll); // 使用 %lld 格式说明符读取 long long 类型// 输入无符号长长整型printf("Enter an unsigned long long integer: ");scanf("%llu", &ull); // 使用 %llu 格式说明符读取 unsigned long long 类型// 打印输入的值以验证printf("Values entered:\n");printf("Short: %hd\n", s);                 // 输出 short 类型printf("Unsigned Short: %hu\n", us);       // 输出 unsigned short 类型printf("Int: %d\n", i);                    // 输出 int 类型printf("Unsigned Int: %u\n", ui);          // 输出 unsigned int 类型printf("Long: %ld\n", l);                  // 输出 long 类型printf("Unsigned Long: %lu\n", ul);        // 输出 unsigned long 类型printf("Long Long: %lld\n", ll);           // 输出 long long 类型printf("Unsigned Long Long: %llu\n", ull); // 输出 unsigned long long 类型return 0;
}

        程序在 VS code 中的运行结果如下所示:

3.8 精确宽度类型

        在 C 语言中,传统的整数类型(如 short、int、long)在不同计算机架构上的字节宽度可能不同。这种不确定性可能导致代码在不同平台上的行为不一致,尤其是在嵌入式开发中,精确控制数据宽度至关重要。

        为了提高代码的可移植性和一致性,C99 标准引入了 <stdint.h> 头文件,其中定义了一系列精确宽度整数类型。这些类型确保了特定位宽的有符号和无符号整数,无论在哪种平台上编译,都能保证数据类型的大小。

3.8.1 类型列表

类型名称含义
int8_t8 位有符号整数
int16_t16 位有符号整数
int32_t32 位有符号整数
int64_t64 位有符号整数
uint8_t8 位无符号整数
uint16_t16 位无符号整数
uint32_t32 位无符号整数
uint64_t64 位无符号整数
  • int64_t 和 uint64_t 需要使用 LL 和 ULL 后缀表示大整数 

3.8.2 使用演示

#include <stdio.h>
#include <stdint.h>int main()
{// 声明一个 8 位有符号整数变量 x8,使用精确宽度类型 int8_t// 无论在哪个平台上编译,x8 始终是 8 位(1 个字节)int8_t x8 = -100;// 声明一个 8 位无符号整数变量 u8,使用精确宽度类型 uint8_t// 无论在哪个平台上编译,u8 始终是 8 位(1 个字节)uint8_t u8 = 200;// 声明一个 16 位有符号整数变量 x16,使用精确宽度类型 int16_t// 无论在哪个平台上编译,x16 始终是 16 位(2 个字节)int16_t x16 = 30000;// 声明一个 16 位无符号整数变量 u16,使用精确宽度类型 uint16_t// 无论在哪个平台上编译,u16 始终是 16 位(2 个字节)uint16_t u16 = 60000;// 声明一个 32 位有符号整数变量 x32,使用精确宽度类型 int32_t// 无论在哪个平台上编译,x32 始终是 32 位(4 个字节)int32_t x32 = 45933945;// 声明一个 32 位无符号整数变量 u32,使用精确宽度类型 uint32_t// 无论在哪个平台上编译,u32 始终是 32 位(4 个字节)uint32_t u32 = 4000000000U;/* int64_t 和 uint64_t 需要使用 LL 和 ULL 后缀表示大整数*/// 声明一个 64 位有符号整数变量 x64,使用精确宽度类型 int64_t// 无论在哪个平台上编译,x64 始终是 64 位(8 个字节)int64_t x64 = -9000000000000000000LL;// 声明一个 64 位无符号整数变量 u64,使用精确宽度类型 uint64_t// 无论在哪个平台上编译,u64 始终是 64 位(8 个字节)uint64_t u64 = 18000000000000000000ULL;// 打印各个变量的值printf("x8 (8-bit signed): %d\n", x8);printf("u8 (8-bit unsigned): %u\n", u8);printf("x16 (16-bit signed): %d\n", x16);printf("u16 (16-bit unsigned): %u\n", u16);printf("x32 (32-bit signed): %d\n", x32);printf("u32 (32-bit unsigned): %u\n", u32);printf("x64 (64-bit signed): %lld\n", x64);printf("u64 (64-bit unsigned): %llu\n", u64);return 0;
}

        程序在 VS code 中的运行结果如下所示:

3.8.3 实现原理

        这些类型实际上是类型别名,编译器会根据目标平台的特性,将它们映射到底层的基本类型(如 int、long 等)。例如:

  • 在某个系统中,如果 int 类型是 32 位的,int32_t 会被映射到 int。
  • 如果 long 类型是 32 位的,int32_t 则可能被映射到 long。

        这种映射机制确保了:

  • 跨平台一致性:无论在哪种平台上,int32_t 始终是 32 位。
  • 代码可读性:开发者可以明确指定所需的位宽,无需担心底层类型的差异。

3.8.4 查看头文件源代码

        我们可以通过按住【Ctrl 键】并点击鼠标左键的方式,查看程序中数据类型的头文件源代码。

        当我们将鼠标悬停在 int8_t 上,并按下【Ctrl 键】的同时点击鼠标左键,就会跳转到 <stdint.h> 头文件源代码中该类型的定义部分。

        <stdint.h> 头文件中定义精确宽度数据类型的代码片段如下所示:

        我们可以看出,在 <stdint.h> 头文件中,定义了一系列具有精确宽度的整数类型别名。这些类型别名提供了一种标准化的方式来指定数据类型的位宽,使得在不同平台上进行编程时,能够确保数据类型的一致性。这对于跨平台编程尤其重要,因为不同平台(如 32 位和 64 位系统)上基本数据类型的位宽可能会有所不同。

  1. typedef signed char int8_t; 和 typedef unsigned char uint8_t;
    • 定义了 8 位有符号和无符号整数类型。int8_t 表示 8 位有符号整数,uint8_t 表示 8 位无符号整数。
  2. typedef short int16_t; 和 typedef unsigned short uint16_t;
    • 定义了 16 位有符号和无符号整数类型。int16_t 表示 16 位有符号整数,uint16_t 表示 16 位无符号整数。
  3. typedef int int32_t; 和 typedef unsigned int uint32_t;
    • 定义了 32 位有符号和无符号整数类型。int32_t 表示 32 位有符号整数,uint32_t 表示 32 位无符号整数。
  4. __MINGW_EXTENSION typedef long long int64_t; 和 __MINGW_EXTENSION typedef unsigned long long uint64_t;
    • 定义了 64 位有符号和无符号整数类型。int64_t 表示 64 位有符号整数,uint64_t 表示 64 位无符号整数。
    • __MINGW_EXTENSION 是一个特定于 MinGW 编译器的扩展,用于支持一些非标准的特性。

相关文章:

13 数据存储单位与 C 语言整数类型:从位到艾字节、常见整数类型及其范围、字面量后缀、精确宽度类型详解

1 数据存储单位 在计算机科学领域&#xff0c;数据存储采用分层级的单位体系&#xff0c;各层级单位以 2 的幂次方为换算基础&#xff0c;而非传统数学中的 10 的幂次方。 以下是常见的数据存储单位介绍&#xff1a; 位&#xff08;bit&#xff0c;b&#xff09;是计算机中的最…...

【CPU】结合RISC-V CPU架构回答中断系统的7个问题(个人草稿)

结合RISC-V CPU架构对中断系统七个关键问题的详细解析&#xff0c;按照由浅入深的结构进行说明&#xff1a; 一、中断请求机制&#xff08;问题①&#xff09; 硬件基础&#xff1a; RISC-V通过CLINT&#xff08;Core Local Interrupter&#xff09;和PLIC&#xff08;Platfor…...

基于unsloth微调一个越狱大模型

网上其实并没有找到现成的开源越狱数据集&#xff0c;所以数据集获取是个麻烦事。想了想easydataset&#xff0c;可能还是不行&#xff0c;easydataset是基于大模型回答的&#xff0c;大模型一般都做了对齐训练&#xff0c;那本地文档生成数据这条路也不可靠。 现成的越狱数据…...

城市客运安全员证适用岗位及要求

城市客运安全员证适用岗位及要求 城市客运安全员证是从事城市公共交通行业安全管理工作的重要资格证书&#xff0c;主要适用于以下岗位&#xff1a; 1. 公交车辆安全员 岗位职责&#xff1a;负责公交车辆运行过程中的安全监督&#xff0c;检查乘客携带物品&#xff0c;防止危…...

UDP协议详解

UDP协议详解 一、理解socket套接字 1.1理解IP ​ 我们都知道在网络中IP用来标识主机的唯一性。那么&#xff1f;这句话该如何理解呢&#xff1f;大家来思考一个问题&#xff1a;计算机之间传输传输数据是目的吗&#xff1f;就好比&#xff0c;你爸叫你给你妈带句话&#xff…...

Unreal Engine中FRotator与FQuat在赛车游戏方向盘控制中的协同应用解析

摘要 深入剖析 Unreal Engine 中这两个关键组件在赛车游戏方向盘控制中的协同作用&#xff0c;涵盖全流程与实践技巧。 一、引言 在赛车游戏开发中&#xff0c;实现逼真的方向盘控制是提升玩家体验的关键要素之一。而在 Unreal Engine 里&#xff0c;FRotator 与 FQuat 这两…...

第十四届蓝桥杯 2023 C/C++组 飞机降落

目录 题目&#xff1a; 题目描述&#xff1a; ​编辑题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 洛谷 P9241 [蓝桥杯 20…...

完美解决Microsoft Edge浏览器无法同步/一直在同步中/更新失败等问题

在使用Microsoft Edge浏览器的过程中&#xff0c;我们可能会遇到一些常见的问题&#xff0c;例如无法同步数据或无法更新浏览器。这些问题通常可以归结为以下两个主要原因&#xff1a; 一、网络连接问题 当Edge浏览器无法同步或更新时&#xff0c;首要考虑的是网络连接问题。…...

CSS文本属性

CSS文本属性 在CSS中&#xff0c;可以使用以下属性来设置文本的样式和布局&#xff1a; 1.color &#xff1a; 设置文本颜色。可以使用颜色名称、十六进制值或RGB值来指定颜色&#xff1a; p{color:red; }font-family &#xff1a; 设置文本的字体系列。可以指定一个或多个字…...

思科路由器做DNS服务器

1.实验环境中&#xff0c;常常需要一台DNS服务器来做名称解析&#xff0c;一般会安装一台windows server&#xff0c;启用dns服务&#xff0c;或者安装一台Linux服务器&#xff0c;安装Bind来实现&#xff1b;虽然可以实现你想要的功能&#xff0c;但是费时费力且配置复杂&…...

Windows部署FunASR实时语音听写便捷部署教程

FunASR提供可便捷本地或者云端服务器部署的实时语音听写服务,内核为FunASR已开源的runtime-SDK。 FunASR集成了达摩院语音实验室在Modelscope社区开源的语音端点检测(VAD)、Paraformer-large非流式语音识别(ASR)、Paraformer-large流式语音识别(ASR)、标点预测(PUNC) 等相关能…...

C++之unordered封装

目录 一、哈希表的修改 1.1、哈希表节点结构 1.2、迭代器 1.3、哈希表结构 1.4、完整代码 二、unordered_map的实现 二、unordered_set的实现 一、哈希表的修改 注意&#xff1a;这里我们使用哈希桶来封装unordered_map和unordered_set。 1.1、哈希表节点结构 templa…...

Pycharm(九)函数的闭包、装饰器

目录 一、函数参数 二、闭包 三、装饰器 一、函数参数 def func01():print("func01 shows as follows") func01() # 函数名存放的是函数所在空间的地址 print(func01)#<function func01 at 0x0000023BA9FC04A0> func02func01 print(func02)#<function f…...

7. 栈与队列(随想录)

1.栈实现队列 2.用队列实现栈 3.有效的括号 4.删除字符串中的所有相邻重复项 5.逆波兰表达式 6.滑动窗口最大值 7.前k个高频元素...

GPU软硬件架构协同设计解析

GPU软硬件架构协同设计解析 ​ GPU(图形处理器)的软硬件协同设计是其在通用计算和高性能计算(HPC)领域取得突破的核心原因。以下从硬件架构、软件架构、协同设计的关键技术及典型案例展开深度解析。 一、硬件架构的核心设计原则 流式多处理器(SM)的模块化设计 计算单元…...

【软考】论NoSQL数据库技术及其应用示例

论NoSQL数据库技术及其应用 随着互联网web2.0网站的兴起&#xff0c;传统关系数据库在应对web2.0 网站&#xff0c;特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心&#xff0c;暴露了很多难以克服的问题&#xff0c;而非关系型的数据库则由于其本身的特点得到…...

特伦斯智慧钢琴评测:如何用科技重塑钢琴学习新体验

对于渴望学习钢琴的爱好者而言&#xff0c;传统钢琴的笨重体积、高昂成本与扰民问题往往成为绊脚石。而智能电钢琴的出现&#xff0c;正以轻量化设计、沉浸式体验与智能化功能打破这些壁垒。特伦斯智慧钢琴凭借其专业级硬件配置与创新教学系统&#xff0c;成为市场中兼具性能与…...

UML 状态图:解锁电子图书馆管理系统的高效设计

目录 一、UML 状态图的核心要素 状态&#xff1a;系统行为的 “栖息地” 转换&#xff1a;连接状态的 “桥梁” 动作&#xff1a;赋予功能的 “实践者” 二、电子图书馆管理系统状态图解析 系统空闲状态&#xff1a;一切的起点 读者登录与身份验证&#xff1a;安全的 “…...

UML 状态图:陪伴机器人系统示例

目录 一、状态图的基本概念 1.1 状态 1.2 转换 1.3 动作 二、陪伴机器人系统状态图解析 2.1 初始与待机状态 2.2 情绪检测中状态 2.3 陪伴模式下的细分 2.4 疏导模式的严谨流程 2.5 安抚模式的关键作用 三、状态图绘画 四、UML 状态图的强大 4.1 直观呈现系统行为…...

超详细实现单链表的基础增删改查——基于C语言实现

文章目录 1、链表的概念与分类1.1 链表的概念1.2 链表的分类 2、单链表的结构和定义2.1 单链表的结构2.2 单链表的定义 3、单链表的实现3.1 创建新节点3.2 头插和尾插的实现3.3 头删和尾删的实现3.4 链表的查找3.5 指定位置之前和之后插入数据3.6 删除指定位置的数据和删除指定…...

分布式光纤测温技术让森林火灾预警快人一步

2025年春季&#xff0c;多地接连发生森林火灾&#xff0c;累计过火面积超 3万公顷。春季历来是森林草原火灾易发、多发期&#xff0c;加之清明节已到来&#xff0c;生产生活用火活跃&#xff0c;民俗祭祀用火集中&#xff0c;森林火灾风险进一步加大。森林防火&#xff0c;人人…...

判断链表是否为环(Java版本自己用)

141. 环形链表 核心代码版本&#xff1a; public class Solution {public boolean hasCycle(ListNode head) {if (head null) {return false;}ListNode slow head;ListNode fast head.next;while (fast ! null && fast.next ! null) {if (slow fast) {return true…...

leetcode 516. Longest Palindromic Subsequence

题目描述&#xff1a; 代码&#xff1a; class Solution { public:int longestPalindromeSubseq(string s) {int n s.size();//i<j,dp[i][j]表示s[i,j]的最长回文子串的长度,按照这个定义dp[0][n-1]就是答案,i>j的dp[i][j]不定义vector<vector<int>> dp(n,…...

关于敏感文件或备份 安全配置错误 禁止通过 URL 访问 Vue 项目打包后的 .gz 压缩文件

要禁止通过 URL 访问 Vue 项目打包后的 .gz 压缩文件&#xff08;如 sc.6abb69d9.css.gz&#xff09;或其他敏感文件&#xff0c;可以通过 Nginx 配置和 Tomcat 配置双重防护来实现。以下是具体解决方案&#xff1a; 方法 1&#xff1a;通过 Nginx 配置禁止访问 .gz 文件 在 N…...

Linux系统启动全流程解析:从BIOS到用户登录

摘要 深度解析Linux系统启动五阶段&#xff1a;内核加载→init进程初始化→系统服务启动→终端创建→用户登录&#xff0c;涵盖SysV/Systemd差异及运行级别管理&#xff0c;提供故障排查指南。 一、启动流程全景概览 Linux系统启动过程严格遵循5个阶段顺序执行&#xff0c;每…...

unity动态骨骼架设+常用参数分享(包含部分穿模解决方案)

Unity骨骼物理模拟插件Dynamic Bone Dynamic Bone 可用于对角色的骨骼&#xff08;bones&#xff09;或者铰链系统&#xff08;joints&#xff09;施加物理效果。 物理效果可以使得游戏角色的头发、衣服、胸部或者是其他的任何部位&#xff0c;都可以以近似真实的状态运动。 …...

【云原生】k8s集群部署最新版ELFK日志采集平台

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Golang开…...

基于瑞芯微RK3576国产ARM八核2.2GHz A72 工业评估板——ROS2系统使用说明

前 言 本文主要介绍创龙科技TL3576-MiniEVM评估板演示基于Ubuntu的ROS系统(版本:ROS2 Foxy)使用说明,包括镜像编译、镜像替换,以及ROS系统测试的方法。适用开发环境如下。 Windows开发环境:Windows 10 64bit Linux虚拟机环境:VMware16.2.5、Ubuntu22.04.5 64bit U-B…...

android studio sdk unavailable和Android 安装时报错:SDK emulator directory is missing

md 网上说的都是更换proxy代理什么的&#xff0c;还有一些二其他乱七八糟的&#xff0c;根本没用&#xff0c;感觉很多就是解决不了问题&#xff0c;还贼多贼一致&#xff0c;同质化&#xff0c;感觉很坑人&#xff0c;让人觉得他们和我的一样的&#xff0c;大家都是按他们说的…...

qemu构建arm环境(AI生成)

要编译 qemu-system-arm&#xff0c;你需要安装一些依赖库&#xff0c;配置编译环境&#xff0c;并执行编译过程。以下是一般步骤&#xff0c;适用于大多数基于Linux的系统。 1. 安装依赖 首先&#xff0c;你需要安装一些必要的开发工具和库。你可以使用包管理器来安装这些依…...

10天学会嵌入式技术之51单片机-day-4

第十二章 中断系统 中断系统是单片机用于处理外部紧急事件的一种机制。中断系统工作的大致流程如下 图所示&#xff1a;当 CPU 正在处理某项任务时&#xff0c;外部发生了某个紧急事件&#xff0c;此时 CPU 会暂停当前 的工作&#xff0c;转而去处理这个紧急事件&#xff0c;处…...

spark—SQL3

连接方式 内嵌Hive&#xff1a; 使用时无需额外操作&#xff0c;但实际生产中很少使用。 外部Hive&#xff1a; 在虚拟机下载相关配置文件&#xff0c;在spark-shell中连接需将hive-site.xml拷贝到conf/目录并修改url、将MySQL驱动copy到jars/目录、把core-site.xml和hdfs-sit…...

CENTOS 7 安装VNC

一、VNC简介 VNC&#xff08;Virtual Network Computing&#xff09;&#xff0c;为一种使用RFB协议的屏幕画面分享及远程操作软件。此软件借由网络&#xff0c;可发送键盘与鼠标的动作及即时的屏幕画面。 VNC与操作系统无关&#xff0c;因此可跨平台使用&#xff0c;例如可用…...

第42讲:走进智慧农业的“感知神经系统”——农田遥感 + 边缘计算的融合实践

目录 ✨一、为什么要融合遥感与边缘计算? 🧪二、典型应用场景案例 ✅ 案例 1:棉花田的智能水分监测系统 ✅ 案例 2:水稻纹枯病自动识别与预警系统 💻三、关键技术框架与实现思路 🚦 1. 系统架构流程图: 📦 2. 模型部署建议: 💡四、未来发展趋势展望 �…...

Dify忘记管理员密码,重置的问题

今天本地win10电脑&#xff0c;使用源码启动dify&#xff0c;忘记了管理员账号和密码&#xff0c;于是网上查找解决办法。 1.有的网上资料说是去数据库删除用户表&#xff0c;于是进入数据库&#xff1a; docker exec -it docker-db-1 psql -U postgres -d dify 找到postgre…...

C#—Lazy<T> 类型(延迟初始化/懒加载模式)

C# 的 Lazy<T> 类型 Lazy<T> 是 C# 中的一个类&#xff0c;用于实现延迟初始化&#xff08;懒加载&#xff09;模式。它提供了一种线程安全的方式来延迟创建大型或资源密集型对象&#xff0c;直到第一次实际需要时才进行初始化。 主要特点 延迟初始化&#xff1a…...

unity打包安卓时的签名文件jks转换keystore

前言 unity打包安卓时需要的签名文件格式默认是keystore&#xff0c;而有时我们拿到的是jks格式的签名文件&#xff0c;就需要把jks格式文件转换成keystore格式文件。 其实在windows下也可以不转换&#xff0c;在选择签名文件的文件选择框时&#xff0c;把文件扩展名筛选项&a…...

Android audio_policy_configuration.xml加载流程

目录 一、audio_policy_configuration.xml文件被加载流程 1、AudioPolicyService 创建阶段 2、createAudioPolicyManager 实现 3、AudioPolicyManager 构造 4、配置文件解析 loadConfig 5、核心解析逻辑 PolicySerializer::deserialize 二、AudioPolicyConfig类解析 1、…...

AOSP Android14 Launcher3——远程窗口动画关键类SurfaceControl详解

在 Launcher3 执行涉及其他应用窗口&#xff08;即“远程窗口”&#xff09;的动画时&#xff0c;例如“点击桌面图标启动应用”或“从应用上滑回到桌面”的过渡动画&#xff0c;SurfaceControl 扮演着至关重要的角色。它是实现这些跨进程、高性能、精确定制动画的核心技术。 …...

iframe下系统访问跨域问题解决办法

问题描述&#xff1a;iframe下嵌入web页面&#xff0c;访问后端接口跨域&#xff0c;导致接口调不通。 产生原因&#xff1a;iframe下&#xff0c;web端访问后端接口时&#xff0c;会优先向后端发送请求方法为OPTIONS的预检测请求&#xff0c;该请求调用不通&#xff0c;导致真…...

Kafka 如何理解Kafka的高可用

一、Kafka高可用核心思想&#xff1a;备胎的自我修养 核心口诀&#xff1a;“别把鸡蛋放在一个篮子里&#xff0c;除非你他妈有100个篮子&#xff01;” Kafka的高可用设计&#xff0c;本质上就是一场**“分布式备胎大战”**。它的核心逻辑是&#xff1a; “老子不信任任何单…...

11-DevOps-Jenkins Pipeline流水线作业

前面已经完成了&#xff0c;通过在Jenkins中创建自由风格的工程&#xff0c;在界面上的配置&#xff0c;完成了发布、构建的过程。 这种方式的缺点就是如果要在另一台机器上进行同样的配置&#xff0c;需要一项一项去填写&#xff0c;不方便迁移&#xff0c;操作比较麻烦。 解…...

C++学习之游戏服务器开发十一DOCKER的基本使用

目录 1.多实例部署方案 2.容器的概念 3.docker初识 4.docker仓库 5.docker镜像 6.docker容器 7.docker和虚拟机的区别 8.docker命令解释 9.dockerfile构建镜像 10.离线分发镜像 1.多实例部署方案 redis 命令&#xff08; redis-cli XXXX &#xff09; set key value:…...

docker学习笔记2-最佳实践

一、在容器中启动mysql的最佳实践 &#xff08;一&#xff09;查找目录 1、mysql的配置文件路径 /etc/mysql/conf.d 2、mysql的数据目录 /var/lib/mysql 3、环境变量 4、端口 mysql的默认端口3306。 &#xff08;二&#xff09;启动命令 docker run -d -p 3306:3306 …...

【TeamFlow】4.2 Yew库详细介绍

Yew 是一个用于构建高效、交互式前端 Web 应用程序的现代 Rust 框架&#xff0c;它借鉴了 React 和 Elm 等框架的设计理念&#xff0c;同时充分利用 Rust 的语言特性。 核心特性 基于组件的架构 Yew 采用组件化开发模式&#xff0c;类似于 React: 组件是可重用的 UI 构建块 …...

第六章.java集合与泛型

文章目录 1.集合框架1. Collection 接口存储一组不唯一,无序的对象2. Set接口存储一组唯一,无序的对象3. Map接口存储一组键值对象,提供key到value的映射 2.封装3.练习题 1.集合框架 java集合框架提供了一套性能优良,使用方便的接口和类,它们位于java.util中 1. Collection 接…...

elastic/go-elasticsearch与olivere/elastic

在 Go 语言中&#xff0c;与 Elasticsearch 交互的客户端库有多种选择&#xff0c;其中 github.com/elastic/go-elasticsearch/v8 和 github.com/olivere/elastic/v7 是两个常用的库。这两个库的功能和用途有一些差异&#xff0c;以下是它们的详细对比&#xff1a; 1. github.c…...

MYSQL之基础认识(卸载安装登录, 基本概念)

一. 卸载安装和登录 卸载 MYSQL 1. 查看有无mysql服务正在运行: ps ajx | grep mysql 2. 查看到 mysql 的服务名称: systemctl list-units --typeservice | grep mysql 3. 关闭 mysql 服务 4. 卸载 dpkg -l | grep mysql | awk {print $2} | xargs sudo apt remove --purg…...

Sentinel源码—7.参数限流和注解的实现一

大纲 1.参数限流的原理和源码 2.SentinelResource注解的使用和实现 1.参数限流的原理和源码 (1)参数限流规则ParamFlowRule的配置Demo (2)ParamFlowSlot根据参数限流规则验证请求 (1)参数限流规则ParamFlowRule的配置Demo 一.参数限流的应用场景 二.参数限流规则的属性 …...

JAVA:利用 Apache Tika 提取文件内容的技术指南

1、简述 Apache Tika 是一个强大的工具,用于从各种文件中提取内容和元数据。📄Tika 支持解析文档、📸图像、🎵音频、🎥视频文件以及其他多种格式,非常适合构建🔍搜索引擎、📂内容管理系统和📊数据分析工具。 样例代码:https://gitee.com/lhdxhl/springboot-…...