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来避免平台差异。

相关新闻

C语言串口通信实战:从原理到跨平台框架构建

C语言串口通信实战:从原理到跨平台框架构建

1. 项目概述:从零构建C语言串口通信能力在嵌入式开发和工业控制领域,串口通信就像设备之间最古老、最可靠的信使。它不追求花哨的高速,却以极致的稳定性和简单的硬件连接,成为单片机、传感器、工控机之间对话的首选协议。当你用C语…

2026/7/31 2:03:36阅读更多 →
RuoYi-Cpp:客户端使用Qt,后端使用libhv实现

RuoYi-Cpp:客户端使用Qt,后端使用libhv实现

Zc管理系统 一个基于 C 技术栈的企业级管理系统,模仿了前端框架若依(RuoYi)管理系统的架构设计,采用客户端-服务器分离的架构模式。 目录 zcmaye/zc-manager: 一个基于 C 技术栈的企业级管理系统,模仿了前端框架若依&…

2026/7/31 2:03:36阅读更多 →
2026 年 GEO 服务商怎么选:AI 搜索时代品牌可见性的实战判断框架

2026 年 GEO 服务商怎么选:AI 搜索时代品牌可见性的实战判断框架

2026 年,品牌被看见的方式正在变化。越来越多的用户不再只看传统搜索结果,而是直接在 DeepSeek、豆包、通义千问、文心一言、Kimi、ChatGPT、Perplexity、Gemini 等 AI 平台里提问、筛选和决策。对市场负责人来说,问题已经不是“要不要做内容…

2026/7/31 2:01:36阅读更多 →
慢速英语听力训练:Mr. English系列51-100集实操指南

慢速英语听力训练:Mr. English系列51-100集实操指南

在英语学习过程中,听力往往是许多学习者感到棘手的环节,尤其是对于小学高段以上的学生而言,面对语速较快的原声材料时,容易产生挫败感。本文将围绕一套备受好评的慢速英语听力训练资源——"Mr. English"系列&#xff08…

2026/7/31 3:12:50阅读更多 →
OriginCar智能小车:从硬件安装到PID调试的嵌入式开发全流程实践

OriginCar智能小车:从硬件安装到PID调试的嵌入式开发全流程实践

1. 项目启动:OriginCar开箱与核心认知拿到OriginCar套件的那一刻,心情是既兴奋又带点忐忑的。这不像是一个现成的玩具车,更像是一个等待被唤醒的、具备完整机器人潜质的“数字生命体”。它的首次安装、调试乃至后续的“碰撞”测试&#xff0c…

2026/7/31 3:12:50阅读更多 →
STM32定时器输出比较原理与PWM配置实战指南

STM32定时器输出比较原理与PWM配置实战指南

1. 项目概述:从“定时器输出比较”到精准的PWM控制如果你正在玩STM32,尤其是想用它来驱动舵机、控制电机转速,或者生成任意占空比的方波信号,那么“定时器输出比较”这个功能就是你绕不开的核心技术。很多朋友第一次接触时&#x…

2026/7/31 3:12:50阅读更多 →
跨平台元器件迁移:从嘉立创EDA到Altium Designer的完整指南

跨平台元器件迁移:从嘉立创EDA到Altium Designer的完整指南

1. 从嘉立创EDA到Altium Designer:一次跨越平台的元器件迁移在硬件工程师的日常里,元器件库的管理和复用是个永恒的话题。你可能在嘉立创EDA上找到了一个心仪的元器件,它的原理图符号画得标准,PCB封装尺寸精准,甚至还有…

2026/7/31 3:12:50阅读更多 →
海思SS626 SDK编译全流程:从环境搭建到镜像生成实战指南

海思SS626 SDK编译全流程:从环境搭建到镜像生成实战指南

1. 项目概述与核心价值最近在折腾海思SS626平台的开发板,从拿到SDK到最终编译出完整的文件系统镜像,整个过程可以说是一波三折。网上关于海思平台,特别是SS626这类较新芯片的资料,远不如老牌的Hi3516、Hi3519那么丰富和系统。很多…

2026/7/31 3:12:50阅读更多 →
3分钟掌握Windows读取Linux分区:Ext2Read新手快速上手指南

3分钟掌握Windows读取Linux分区:Ext2Read新手快速上手指南

3分钟掌握Windows读取Linux分区:Ext2Read新手快速上手指南 【免费下载链接】ext2read A Windows Application to read and copy Ext2/Ext3/Ext4 (With LVM) Partitions from Windows. 项目地址: https://gitcode.com/gh_mirrors/ex/ext2read 你是否曾经在Win…

2026/7/31 3:10:49阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
物理复制比逻辑复制好在哪?数据库复制原理详解

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

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

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

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

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

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

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

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

2026/7/31 0:00:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/31 0:49:33阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →