C 语言基础数据类型详解:大小与内存存储
C 语言基础数据类型详解大小与内存存储1. 引言2. 基础数据类型概览3. 内存存储方式3.1 整型的补码表示3.2 浮点数的 IEEE 754 存储3.3 字节序大端小端3.4 对齐与填充3.5 数据溢出场景整数溢出浮点数溢出与下溢常见溢出场景与防范4. 统一总结表5. 结尾1. 引言C 语言作为一门贴近硬件的编程语言对数据类型的定义和内存占用有着严格的规定。理解基础数据类型的大小及存储方式是写出正确、高效 C 程序的基础。本文将用表格直观展示各基础类型的典型大小并深入剖析它们在内存中的存储形式。2. 基础数据类型概览C 语言的基础数据类型主要包括字符型、整型、浮点型、指针型以及布尔型C99 起。由于标准未完全固定每种类型的字节数实际大小会受编译器、目标平台和操作系统影响但存在最小范围约束。下表以 64 位 LinuxGCC和 64 位 WindowsMSVC的常见实现为例类型中文名称典型大小字节有符号范围64 位无符号范围64 位备注char字符型1-128 ~ 1270 ~ 255也可用于存储小整数unsigned char无符号字符型1–0 ~ 255–signed char有符号字符型1-128 ~ 127––short/short int短整型2-32,768 ~ 32,7670 ~ 65,535–unsigned short无符号短整型2–0 ~ 65,535–int整型4-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295最常用的整数类型unsigned int无符号整型4–0 ~ 4,294,967,295–long长整型8Linux/ 4Windows见备注见备注32 位 Windows 通常为 4 字节unsigned long无符号长整型8Linux/ 4Windows–见备注–long long长长整型8-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,8070 ~ 18,446,744,073,709,551,615C99 引入unsigned long long无符号长长整型8–0 ~ 18,446,744,073,709,551,615–float单精度浮点型4±3.4E-38 ~ ±3.4E38–6~7 位有效数字double双精度浮点型8±1.7E-308 ~ ±1.7E308–15~16 位有效数字long double扩展精度浮点型16Linux/ 8Windows取决于实现–常用于高精度科学计算void*/int*等指针型864 位/ 432 位取决于寻址空间–存储内存地址大小随平台变化_Bool布尔型10 或 1–C99 引入需stdbool.h说明sizeof运算符可用于程序内查看实际大小例如printf(%zu, sizeof(int));。3. 内存存储方式3.1 整型的补码表示C 语言中有符号整数默认使用补码Two’s Complement存储它的设计巧妙使加减法可以统一处理无需关心符号。补码的核心思想最高位作为符号位0 正 1 负并且该位的权重为负值对于 n 位整数最高位权重为 -2^(n-1)其余位与无符号数相同。正数的补码就是其二进制本身负数的补码为其绝对值按位取反再加 1具体计算过程如下补码计算详细步骤以负数 -10 为例演示 8 位写出绝对值的二进制先得到 10 的二进制0000 1010此处用 8 位展示int为 32 位步骤完全一致。按位取反将每一位 0 变 11 变 0得到1111 0101。末位加 11111 0101 1 1111 0110这就是 -10 在 8 位补码下的表示。高位符号扩展若类型宽度更大如int32 位将左侧用符号位即最高位填充。正数左侧填 0负数左侧填 1。例如 -10 在 32 位中表示为11111111 11111111 11111111 11110110。验证1111 0110的最高位为 1表示负数其值 -2^7 118 -128 118 -10正确。边界案例-128 的补码8 位原码与反码均无法表示 -128但补码能扩展一个负数的范围。8 位补码表示 -128 的过程如下写出绝对值的二进制128 的二进制为1000 00008 位。按位取反0111 1111。末位加 10111 1111 1 1000 0000。最终结果依然是1000 0000这就是 8 位补码中的 -128。验证最高位权重为 -2^7 -128其余位全 0合计为 -128正确。结论在 n 位补码中1000...000这个二进制模式恰好代表 -2^(n-1)所以 8 位有符号整数的范围是 -128 ~ 127而非 -127 ~ 127。以下代码以 32 位int演示补码的生成过程inta10;// 二进制00000000 00000000 00000000 00001010intb-10;// 10 取反 1// 10 二进制00000000 00000000 00000000 00001010// 按位取反 11111111 11111111 11111111 11110101// 加一 11111111 11111111 11111111 11110110无符号整数则直接使用纯二进制表示没有符号位。3.2 浮点数的 IEEE 754 存储float和double遵循 IEEE 754 标准由符号位S、指数E和尾数M三部分组成采用科学计数法存储实数。以float为例组成部分位数说明符号 S1 bit0 正 1 负指数 E8 bits偏移量 127即存储值 实际指数 127尾数 M23 bits隐含前导 1规格化数存储小数部分例如float f -5.625;二进制为-101.101科学计数法-1.01101 × 2²S 1负数E 2 127 129 10000001M 01101 0000000000000000023 位最终内存存储11000000 10110100 00000000 00000000十六进制0xC0B40000浮点数表示重点尽管浮点数不是补码但其核心是科学计数法步骤拆解如下绝对值二进制化整数部分除 2 取余小数部分乘 2 取整或补齐有效位。规格化移动小数点使其左侧只有一位 1。例如 5.625 → 二进制 101.101 → 规格化 1.01101 × 2²。提取符号 S0 正 1 负。计算偏移指数 E实际指数 固定偏移量float 偏移 127double 偏移 1023。例如 2 127 129二进制为 10000001。提取尾数 M取规格化后的小数部分不足位右侧补 0。组合S E M 按位拼接。对照float f -5.625S 1E 10000001M 01101000000000000000000完整 32 位 1 10000001 01101000000000000000000 0xC0B40000double的指数占 11 位尾数占 52 位偏移量为 1023精度更高。3.3 字节序大端小端多字节数据在内存中的存放顺序由 CPU 架构决定分为小端序Little-Endian低位字节存放在低地址端x86、x64 常见大端序Big-Endian高位字节存放在低地址端网络字节序等intx0x12345678;// 小端序内存地址从低到高78 56 34 12// 大端序内存地址从低到高12 34 56 78可通过联合体或指针判断当前机器字节序。3.4 对齐与填充为提升访问效率编译器会对数据成员进行地址对齐。例如结构体中structDemo{chara;// 1 字节intb;// 4 字节};// sizeof(struct Demo) 通常为 8 字节而非 5 字节a之后会填充 3 个字节使b对齐到 4 字节边界。可以使用#pragma pack或__attribute__((packed))手动控制。3.5 数据溢出场景当数据值超出其类型所能表示的范围时就会发生溢出。理解溢出有助于避免程序中的隐蔽错误。整数溢出有符号整数溢出C 标准将其定义为未定义行为Undefined Behavior不同编译器/平台可能产生不同结果。#includestdio.h#includelimits.hintmain(){intmax_intINT_MAX;// 2147483647 (32位)intoverflowmax_int1;// 未定义行为通常变为 -2147483648printf(INT_MAX 1 %d\n,overflow);intmin_intINT_MIN;// -2147483648intunderflowmin_int-1;// 未定义行为通常变为 2147483647printf(INT_MIN - 1 %d\n,underflow);return0;}无符号整数溢出C 标准明确定义为模运算模 2ⁿn 为位数结果在 0 到最大值之间循环。#includestdio.h#includelimits.hintmain(){unsignedintmax_uintUINT_MAX;// 4294967295 (32位)unsignedintoverflowmax_uint1;// 结果为 0printf(UINT_MAX 1 %u\n,overflow);unsignedintzero0;unsignedintunderflowzero-1;// 结果为 4294967295printf(0 - 1 %u\n,underflow);return0;}浮点数溢出与下溢浮点数溢出当结果绝对值超出类型能表示的最大值时发生通常得到无穷大INF。#includestdio.h#includefloat.hintmain(){floatmax_floatFLT_MAX;floatoverflowmax_float*2.0f;// 可能得到 INFprintf(FLT_MAX * 2 %f\n,overflow);doublemax_doubleDBL_MAX;doublehugemax_double*10.0;// 可能得到 INFprintf(DBL_MAX * 10 %f\n,huge);return0;}浮点数下溢当结果绝对值小于类型能表示的最小正值时发生可能得到非规格化数或零。#includestdio.h#includefloat.hintmain(){floatmin_normalFLT_MIN;// 最小正规格化数floatunderflowmin_normal/2.0f;// 可能变为非规格化数printf(FLT_MIN / 2 %e\n,underflow);floattiny1e-45f;// 接近 float 能表示的最小正值floatresulttiny/10.0f;// 可能下溢为 0.0printf(1e-45 / 10 %e\n,result);return0;}常见溢出场景与防范循环计数器溢出for(unsignedinti0;iUINT_MAX;i){// 无限循环i 达到 UINT_MAX 后加 1 变为 0}数组索引越界intarr[10];intindex10;// 有效索引 0-9arr[index]42;// 越界访问可能破坏相邻内存算术运算溢出inta1000000;intb1000000;intproducta*b;// 可能溢出结果不正确类型转换溢出longlongbig5000000000LL;// 50亿intsmall(int)big;// 32位 int 无法容纳结果未定义防范建议使用stdint.h中的固定宽度类型如int32_t、uint64_t进行算术运算前检查边界if (a INT_MAX - b) { /* 处理溢出 */ }使用安全库函数__builtin_add_overflowGCC/Clang或编译器内置检查启用编译器警告-Wconversion、-Woverflow对浮点数使用isinf()、isnan()检查特殊值理解溢出机制能帮助开发者编写更健壮、可预测的 C 程序。4. 统一总结表下表汇总基础类型的大小、存储方式及相关注意点类型大小存储方式关键注意事项char1二进制直接存储可用于存储 ASCII 或小整数short2补码有符号/ 纯二进制无符号跨平台需注意 32/64 位差异int4同上最常见整数类型适合循环/计数long4 或 8同上跨平台差异最大谨慎用于序列化long long8同上C99 标准确保 64 位整数float4IEEE 754 单精度精度有限避免直接比较double8IEEE 754 双精度科学计算常用精度较高long double8 或 16IEEE 754 扩展或 80 位精度依赖编译器不建议网络传输void*/ 指针4 或 8直接存储内存地址大小取决于平台位数64 位为 8 字节_Bool10 或 1配合stdbool.h使用true/false5. 结尾掌握基础数据类型的大小和内存存储细节能帮助我们写出更可移植、更高效的 C 代码。面对实际项目时建议使用sizeof明确类型大小必要时引入stdint.h中的固定宽度类型如int32_t来避免平台差异。

相关新闻

MHmarkets:用清单方式看外汇市场服务体验,更容易形成稳定判断

MHmarkets:用清单方式看外汇市场服务体验,更容易形成稳定判断

在外汇相关服务里,MHmarkets是否值得长期关注,往往取决于几个清晰的体验点:说明是否好理解、提示是否到位、流程是否连贯、支持是否稳定。下面从这些维度对MHmarkets做一次正向梳理与要点归纳。在外汇相关服务中,读者最在意的通常…

2026/7/31 2:02:10 阅读更多 →
STM32定时器硬件同步:多轴电机控制与数据采集的精准时序解决方案

STM32定时器硬件同步:多轴电机控制与数据采集的精准时序解决方案

1. 项目缘起:为什么我们需要多个定时器同步启动?在嵌入式开发,尤其是基于STM32这类高性能MCU的项目中,我们常常会遇到一个看似简单却至关重要的需求:让多个定时器在同一时刻、分毫不差地开始计数。你可能觉得&#xff…

2026/7/31 2:02:10 阅读更多 →
Kimi    LeetCode 3791. 给定范围内平衡整数的数目 Python3实现

Kimi LeetCode 3791. 给定范围内平衡整数的数目 Python3实现

以下是 LeetCode 3791. 给定范围内平衡整数的数目 的 Python3 实现。题目理解一个整数是平衡的&#xff0c;当且仅当&#xff1a; 1. 至少包含两位数字 2. 奇数位数字之和等于偶数位数字之和&#xff08;最左边数字位置为1&#xff09;约束&#xff1a;1 < low < high &l…

2026/7/31 2:02:10 阅读更多 →

最新新闻

Verilog延迟语句深度解析:从仿真原理到工程实践

Verilog延迟语句深度解析:从仿真原理到工程实践

1. 项目概述&#xff1a;Verilog延迟语句的深度解析在数字电路设计和硬件描述语言&#xff08;HDL&#xff09;的实践中&#xff0c;Verilog的延迟语句是一个既基础又充满陷阱的概念。很多刚接触FPGA或ASIC设计的朋友&#xff0c;包括我自己在早期项目里&#xff0c;都曾对#5这…

2026/7/31 2:45:23 阅读更多 →
JavaScript学习路径全解析:从零基础到项目实战的优质资源指南

JavaScript学习路径全解析:从零基础到项目实战的优质资源指南

1. 为什么“从零开始”学JavaScript&#xff0c;选对起点比努力更重要最近几年&#xff0c;前端开发的热度一直没降过&#xff0c;而JavaScript作为这门手艺的“母语”&#xff0c;自然成了无数人入行的第一道门槛。我见过太多新手&#xff0c;一上来就抱着厚厚的“红宝书”硬啃…

2026/7/31 2:45:23 阅读更多 →
射频SPDT开关核心结构解析:PIN二极管与FET设计原理及应用对比

射频SPDT开关核心结构解析:PIN二极管与FET设计原理及应用对比

1. 项目概述&#xff1a;射频单刀双掷开关的“心脏”与“骨架”在射频电路的世界里&#xff0c;开关扮演着“交通警察”的角色&#xff0c;它决定了信号的流向。而单刀双掷开关&#xff0c;则是其中最基础、应用最广泛的“十字路口”之一。无论是手机里天线与不同频段收发电路的…

2026/7/31 2:45:23 阅读更多 →
游戏开发者日志解析:从武器设计到技术实现全流程

游戏开发者日志解析:从武器设计到技术实现全流程

这次我们来看一个游戏开发相关的项目——"第一战队豪兽者 纪念版手誓剑UNI.ver"的开发者日志介绍图。从标题来看&#xff0c;这应该是某个游戏或动漫IP的纪念版本开发记录&#xff0c;包含了角色设计、武器设定等关键信息。对于游戏开发者和动漫爱好者来说&#xff0…

2026/7/31 2:45:23 阅读更多 →
和平精英地铁逃生拼装人偶第一弹:完整收集攻略与实战技巧

和平精英地铁逃生拼装人偶第一弹:完整收集攻略与实战技巧

最近在游戏社区看到很多玩家对《和平精英》地铁逃生模式中的拼装人偶系列很感兴趣&#xff0c;但网上资料比较零散&#xff0c;特别是第一弹的完整收集攻略和实战应用技巧。作为资深游戏攻略作者&#xff0c;我整理了这套系统的拼装人偶第一弹全解析&#xff0c;从基础概念到实…

2026/7/31 2:45:23 阅读更多 →
一种基于文化基因工程的人机协同智能生态系统及方法

一种基于文化基因工程的人机协同智能生态系统及方法

[1]邹晓辉,柯丽君. 一种基于文化基因工程的人机协同智能生态系统及方法: CN202511647883.X[P]. CN122133767A[2026-07-30]. 申请(专利)号&#xff1a; CN202511647883.X 申请日期&#xff1a; 2025-11-11 公开/公告号&#xff1a; CN122133767A 发明人&#xff1a; …

2026/7/31 2:44:23 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制&#xff0c;分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件&#xff0c;物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB&#xff08;云原生数据库&#xff09;采用物理复制&#xff0c;在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown&#xff1a;3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前&#xff0c;游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据&#xff0c;中国AI游戏云市场规模已达18.6亿元&#xff1b;同时&#xff0c;游戏研发环节AI渗透率高达86%&#xff0c;生成式AI内容普及率超过50%。面对庞大的市场&#xff0c;游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档&#xff0c;可以直接使用&#xff01;系统支持图片、视频、摄像头等多种方式检测裂缝&#xff0c;功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像&#xff01; pubg绝地求生目标检测数据集 1分类&#xff1a;e_body&#xff0c;14905个标签&#xff0c;txt格式 共计14244张图&#xff0c;99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别&#xff1a; allies enemy tag图片总量&#xff1a;7247张训练集&#xff1a;5139张验证集&#xff1a;1425张测试集&#xff1a;683张标注状态&#xff1a;全部已标注&#xff0c;即拿即用数据格式&#xff1a;支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻