在 C 语言编程中理解数据在内存中的存储规则是从入门到进阶的必经之路。无论是整数、浮点数还是大小端字节序问题都是面试高频考点与底层开发必备知识。本文将带你一次性吃透整数存储、大小端判断、浮点数 IEEE754 标准三大核心知识点搭配经典笔试题解析彻底打通内存底层逻辑。一、整数在内存中的存储原码、反码、补码整数在计算机中以二进制存储有符号整数分为符号位和数值位最高位为符号位0 表示正数1 表示负数。1. 三种二进制表示原码直接将数值按照正负形式翻译为二进制反码符号位不变其余数值位按位取反补码反码的基础上加 12. 核心存储规则正整数原码 反码 补码负整数三种编码完全不同内存真实存储整数一律以补码存放3. 为什么用补码统一处理符号位与数值位无需单独区分符号CPU 只有加法器补码可将加法、减法统一运算补码与原码转换规则一致无需额外硬件电路二、大小端字节序多字节数据的存储顺序超过 1 字节的数据int、short、long 等在内存中存在字节排列顺序问题分为大端字节序和小端字节序。1. 大小端核心定义大端模式数据低位字节存内存高地址高位字节存内存低地址小端模式数据低位字节存内存低地址高位字节存内存高地址极简记忆小端低存低大端高存低2. 常见硬件平台X86 架构常用电脑小端ARM/DSP 处理器多数小端KEIL C51 单片机大端部分 ARM 可硬件切换大小端3. 手写代码判断大小端百度经典笔试题// 方法1指针强转解引用 int check_sys() { int i 1; return (*(char *)i); } // 方法2共用体union判断 int check_sys() { union { int i; char c; }un; un.i 1; return un.c; } // 调用逻辑 int ret check_sys(); ret 1 ? 小端 : 大端;三、整型高频笔试题解析题 1char 正负值打印char a -1; signed char b -1; unsigned char c -1; printf(a%d, b%d, c%d, a, b, c); // 输出a-1, b-1, c255解析unsigned char无符号位-1 的补码全 1解析为十进制 255。题 2char 溢出问题char a -128; printf(%u\n,a); // 输出4294967168解析char 符号位扩展为 int再按无符号整数解析。题 3无限循环陷阱unsigned char i 0; for(i 0; i 255; i); // 死循环永远不会退出解析unsigned char范围 0~255循环条件永远成立。四、浮点数在内存中的存储IEEE 754 标准float、double 严格遵循IEEE 754国际标准存储公式V (-1)^S × M × 2^E1. 三部分组成S符号位0 正数1 负数M有效数字范围 1 ≤ M 2E指数位可正可负2. 32 位 float 内存分配1 位符号位 S8 位指数 E存储时需 127 偏移23 位有效数字 M3. 关键存储规则M默认整数位为 1存储时省略只存小数部分节省 1 位精度E无符号整数存入时 127float/1023double取出时减去偏移量4. 指数 E 的三种读取情况E 不全 0 不全 1常规解析E-127 得真实值M 前加 1E 全 0表示 ±0 或极小浮点数M 不加 1E 全 1M 全 0 表示 ± 无穷大M 非全 0 为 NaN五、浮点数最经典面试题int n 9; float *pFloat (float *)n; printf(n%d\n, n); printf(*pFloat%f\n, *pFloat); *pFloat 9.0; printf(n%d\n, n); printf(*pFloat%f\n, *pFloat);输出结果n9 *pFloat0.000000 n1091567616 *pFloat9.000000核心解析int 9 的二进制 E 全 0 → 按浮点数解析为极小值 → 显示 0.000000float 9.01.001×2³ → S0E130M001… → 转 int 为 1091567616全文总结整数在内存中只存补码统一符号处理与加减运算大小端决定多字节数据排列X86 平台默认小端浮点数严格遵循 IEEE 754 标准S/E/M 分段存储整型溢出、符号扩展、无符号循环是高频易错点掌握本文内容C 语言内存存储、大厂笔试、底层开发直接通关
C 语言深度解剖:数据在内存中如何存储?
在 C 语言编程中理解数据在内存中的存储规则是从入门到进阶的必经之路。无论是整数、浮点数还是大小端字节序问题都是面试高频考点与底层开发必备知识。本文将带你一次性吃透整数存储、大小端判断、浮点数 IEEE754 标准三大核心知识点搭配经典笔试题解析彻底打通内存底层逻辑。一、整数在内存中的存储原码、反码、补码整数在计算机中以二进制存储有符号整数分为符号位和数值位最高位为符号位0 表示正数1 表示负数。1. 三种二进制表示原码直接将数值按照正负形式翻译为二进制反码符号位不变其余数值位按位取反补码反码的基础上加 12. 核心存储规则正整数原码 反码 补码负整数三种编码完全不同内存真实存储整数一律以补码存放3. 为什么用补码统一处理符号位与数值位无需单独区分符号CPU 只有加法器补码可将加法、减法统一运算补码与原码转换规则一致无需额外硬件电路二、大小端字节序多字节数据的存储顺序超过 1 字节的数据int、short、long 等在内存中存在字节排列顺序问题分为大端字节序和小端字节序。1. 大小端核心定义大端模式数据低位字节存内存高地址高位字节存内存低地址小端模式数据低位字节存内存低地址高位字节存内存高地址极简记忆小端低存低大端高存低2. 常见硬件平台X86 架构常用电脑小端ARM/DSP 处理器多数小端KEIL C51 单片机大端部分 ARM 可硬件切换大小端3. 手写代码判断大小端百度经典笔试题// 方法1指针强转解引用 int check_sys() { int i 1; return (*(char *)i); } // 方法2共用体union判断 int check_sys() { union { int i; char c; }un; un.i 1; return un.c; } // 调用逻辑 int ret check_sys(); ret 1 ? 小端 : 大端;三、整型高频笔试题解析题 1char 正负值打印char a -1; signed char b -1; unsigned char c -1; printf(a%d, b%d, c%d, a, b, c); // 输出a-1, b-1, c255解析unsigned char无符号位-1 的补码全 1解析为十进制 255。题 2char 溢出问题char a -128; printf(%u\n,a); // 输出4294967168解析char 符号位扩展为 int再按无符号整数解析。题 3无限循环陷阱unsigned char i 0; for(i 0; i 255; i); // 死循环永远不会退出解析unsigned char范围 0~255循环条件永远成立。四、浮点数在内存中的存储IEEE 754 标准float、double 严格遵循IEEE 754国际标准存储公式V (-1)^S × M × 2^E1. 三部分组成S符号位0 正数1 负数M有效数字范围 1 ≤ M 2E指数位可正可负2. 32 位 float 内存分配1 位符号位 S8 位指数 E存储时需 127 偏移23 位有效数字 M3. 关键存储规则M默认整数位为 1存储时省略只存小数部分节省 1 位精度E无符号整数存入时 127float/1023double取出时减去偏移量4. 指数 E 的三种读取情况E 不全 0 不全 1常规解析E-127 得真实值M 前加 1E 全 0表示 ±0 或极小浮点数M 不加 1E 全 1M 全 0 表示 ± 无穷大M 非全 0 为 NaN五、浮点数最经典面试题int n 9; float *pFloat (float *)n; printf(n%d\n, n); printf(*pFloat%f\n, *pFloat); *pFloat 9.0; printf(n%d\n, n); printf(*pFloat%f\n, *pFloat);输出结果n9 *pFloat0.000000 n1091567616 *pFloat9.000000核心解析int 9 的二进制 E 全 0 → 按浮点数解析为极小值 → 显示 0.000000float 9.01.001×2³ → S0E130M001… → 转 int 为 1091567616全文总结整数在内存中只存补码统一符号处理与加减运算大小端决定多字节数据排列X86 平台默认小端浮点数严格遵循 IEEE 754 标准S/E/M 分段存储整型溢出、符号扩展、无符号循环是高频易错点掌握本文内容C 语言内存存储、大厂笔试、底层开发直接通关