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

整数的储存

1. 重要概念源码反码补码

原码

定义:是一种简单的机器数表示法。对于一个整数,它的原码就是将其绝对值用二进制表示(如2二进制位10)然后除去符号位以外补0

简单来说就是:符号位 + 补0 + 整数的绝对值的二进制

以int类型的2为例4Byte,32bit源码就是

0(符号位)0000000000000000000000000000010(绝对值的二进制)

最高位为符号位,正数符号位为 0,负数符号位为 1。(无符号整数符号位默认为0,即unsigned类型整数)

反码

定义:符号位不变,其余各位按位取反
简单来说就是:符号位不变,其他位置0变成1,1变成0(即按位取反)
以int类型的2为例,其反码为

0(符号位不变)11111111111111111111111111111111101

补码

定义:补码是在反码的基础上加 1
以int类型的2为例,其补码为

0(符号位不变)11111111111111111111111111111111110

!!!!!对于整数来说运算时运用的是补码,储存的也是补码

2.大小端字节序判断

什么是⼤⼩端?
其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分
为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:
⼤端(存储)模式

指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。
⼩端(存储)模式

指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。

我学习时很疑惑的点什么是低字节内容什么是高字节内容
低字节就是指数据的最低有效字节
高字节就是指数据的最高有效字节

简单来说: 就像十进制数有个十百千位,1000的个位就是低字节内容,千位就是高字节内容

举个例子(int 型占 4 字节)中存储整数 0x12345678。

按照小端序存储,在内存中的存储方式(假设从低地址到高地址)是:**78(低字节)**存于最低地址,然后是 56、34、**12(高字节)**存于最高地址。这里的低字节就是指数据的最低有效字节,对于整数来说,它对数值的贡献最小。

3.如何判断当前系统是用什么字节序

1运用指针
原理:将一个多字节的数据类型(如int)的指针转换为字符(char)类型的指针,然后通过字符指针来访问数据的字节。根据访问到的第一个字节的值来判断字节序。
解释:
首先定义一个int型变量num并赋值为 0x01020304。然后将num的地址转换为char类型的指针ptr。
在小端序系统中,最低地址处存储的是数据的最低字节,所以*ptr(即通过字符指针访问的第一个字节)为 0x04;在大端序系统中,*ptr为 0x01。根据这个原理来判断系统的字节序。
在这里插入图片描述
2运用联合体
原理:联合体(Union)的特点是其所有成员共用同一块内存空间。所以可以通过在联合体中定义一个多字节的数据类型(如int或short)和一个字节数组来检查字节的存储顺序。
解释:
首先定义了一个联合体test,它包含一个short类型的成员value和一个字符数组bytes,字符数组的大小为sizeof(short),以确保能容纳short类型的数据。
然后给test.value赋值为 0x0102。在小端序系统中,数据的低位字节存于低地址,所以test.bytes[0]存储的是 0x02,test.bytes[1]存储的是 0x01;在大端序系统中,情况相反。通过检查test.bytes[0]和test.bytes[1]的值,就可以判断系统的字节序。
在这里插入图片描述

浮点数在内存中的储存

在这里插入图片描述
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

简单来说:
关于符号位S,类似整数的储存,符号位只需要一位储存

关于有效数字M,任何一个数都能用科学技术法让整数部分只有一位,10000=1*10的四次方,并且用二进制储存所以有效数字M大于等于1小于2,
然后

关于2的E次方,类似一万用科学计数法记录时,10的四次方

特殊值的存储

零值:在 IEEE 754 标准中,+0 和 - 0 是有区别的。对于单精度浮点数,+0 的存储为 0x00000000, - 0 的存储为 0x80000000;对于双精度浮点数,+0 存储为 0x0000000000000000, - 0 存储为 0x8000000000000000。
无穷大(Infinity):当指数位全为 1,尾数位全为 0 时,根据符号位表示正无穷大或负无穷大。例如,单精度浮点数中,正无穷大存储为 0x7F800000,负无穷大存储为 0xFF800000。
非数(NaN - Not a Number):当指数位全为 1,尾数位不全为 0 时,表示非数。例如,单精度浮点数中,0x7FC00000 等就是非数的一种表示。
!!!!!由于该储存方式,浮点数的精度不高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值