C语言-数据在内存中的存储

发布时间:2026/6/26 22:50:17
C语言-数据在内存中的存储 数据在内存中的存储核心可以概括为所有数据最终都以二进制形式存储但不同类型的数据整数、浮点数、字符等在存储时的编码规则和解释方式不同。下面我们分几个关键点来详细说明一、整数在内存中的存储整数是最基本的数据类型。在C语言中整数在内存中是以二进制的补码形式存储的。整数的2进制表⽰⽅法有三种即原码、反码和补码。●原码、反码、补码⊙原码直接将数值按照正负数的形式翻译成二制。最高位是符号位0正1负其余是数值 位。⊙反码正数的反码与原码相同负数的反码是符号位不变数值位按位取反。⊙补码 正数的补码与原码相同负数的补码是反码加1。●为什么用补码在计算机系统中数值一律用补码来表示和储存。原因在于使用补码可以将符号位和数值域统一处理并且加法和减法可以统一处理CPU只有加法器。此外补码与原码相互转换其运算过程是相同的不需要额外的硬件电路。例如计算1 - 1在CPU看来就是1 (-1)如果用补码计算结果正好为0非常方便。⊙ 示例 int a -1;⊙ 原码10000000 00000000 00000000 00000001⊙ 反码111111111 111111111 111111111 111111110⊙ 补码111111111 111111111 111111111 111111111二、大小端字节序这是一个非常重要的概念它决定了多字节数据如int、float在内存中字节的排列顺序。●大端字节序数据的高位字节存储在内存的低地址处低位字节存储在高地址处。●小端字节序数据的低位字节存储在内存的低地址处高位字节存储在高地址处。●为什么会有大小端因为计算机系统是以字节为单位的每个地址单元对应一个字节。⼀个字节为8bit位但是在C语⾔中除了8bit的 char 之外还有16bit的 short 型32bit的 long 型要看具体的编译器另外对于位数⼤于8位的处理器例如16位或者32位的处理器由于寄存器宽度⼤于⼀个字节那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了⼤端存储模式和⼩端存储模式。●如何判断你的机器是大端还是小端可以通过一个简单的C程序来判断三、浮点数在内存中的存储浮点数的存储比整数复杂它遵循IEEE754标准。IEEE754规定对于32位的浮点数(float)最⾼的1位存储符号位S接着的8位存储指数E剩下的23位存储有效数字M。对于64位的浮点数(double)最⾼的1位存储符号位S接着的11位存储指数E剩下的52位存储有效数字M。● 符号位 S: 0表示正数1表示负数。● 指数位 E: 存储的是移码真实指数中间数127用于表示浮点数的范围。如何得到中间数⾸先E为⼀个⽆符号整数unsigned int这意味着如果E为8位它取 值范围为0~255如果E为11位它的取值范围为0~2047。但是我们知道科学计数法中的E是可以出现负数的所以IEEE 754规定存⼊内存时E的真实值必须再加上⼀个中间数对于8位的E这个中间数是127对于11位的E这个中间数是1023。● 有效数字位 M: 存储的是有效数字的小数部分。由于IEEE754规定尾数的整数部分总是1规格化数所以这个1被省略只存储小数部分从而多了一位精度。3.1 浮点数的存示例float a 5.5;1、二进制表示101.12、科学计数法1.011*2^23、符号位 S 04、指数 E 2 127 129二进制为 100000015、尾数 M 011 (省略了整数部分的1后面补0到23位)6、最终内存中的二进制0 10000001 011000000000000000000003.2 浮点数的取指数E从内存中取出还可以再分成三种情况E不全为0或不全为1常规情况这时浮点数就采⽤下⾯的规则表⽰即指数E的计算值减去127或1023得到真实值再将有效数字M前加上第⼀位的1。⽐如0.5 的⼆进制形式为0.1由于规定正数部分必须为1即将⼩数点右移1位则为1.0* 其阶码为-1127(中间值) 126表⽰为01111110⽽尾数1.0去掉整数部分为0补⻬0到23位00000000000000000000000则其⼆进制表⽰形式为:示例float a 0.5;1、二进制表示0.12、科学计数法1.0 * 2^-13、符号位 S 04、指数 E -1 127 126 0111 11105、尾数 M 0(去掉了整数部分的1后面补0到23位)000000000000000000000006、最终内存中的二进制0 01111110 00000000000000000000000E全为0这时浮点数的指数E等于1-127或者1-1023即为真实值有效数字M不再加上第⼀位的1⽽是还原为0.xxxxxx的⼩数。这样做是为了表⽰±0以及接近于0的很⼩的数字。0 00000000 00100000000000000000000E全为1这时如果有效数字M全为0表⽰±⽆穷⼤正负取决于符号位s0 11111111 00100000000000000000000四、字符在内存中的存储字符在内存中存储的是其对应的编码最常用的是ASCII码。示例 char ch a;⊙ 字符A的ASCII码值是97。⊙ 所以在内存中变量ch存储的是97的二进制形式 01100001。五、总结理解这些存储方式能帮助我们更好的理解指针、类型转换、网络编程注意字节序转换以及一些底层调试问题。