【C语言进阶】--- 数据在内存中的存储方式

整型的存储方式

整型的分类

整型大致分为:char、short、int
char:字符型, 占1个字节的空间
short:短整型,占2个字节的空间
int: 整型, 占4个字节的空间

存储方式

这里声明,借用我在讲【C语言】— 操作符中的部分内容
整数的二进制表示形式:原码、反码、补码

  • 正整数的原码、反码、补码是相同的
  • 负的整数是要计算的
  • 一个int整型变量所占4个字节,因此就是32个比特位,一个比特位就是一个二进制位,因此32个二进制位存储该数据 如下:
    在这里插入图片描述
    整数在内存中是用补码进行存储的,也是用补码进行计算的

接下来讨论内存中的数据与地址大小的关系

首先,从整体来看,数据是由高地址向低地址存放的
一个地址管理一个字节的内存,而像 int 这样的整型创建的变量占4个字节,就需要4个地址来管理
我们平时所说的变量的地址,实际上是这4个地址的首地址,也就是4个地址中最低的那个地址
如下图,两种存储顺序
在这里插入图片描述
像这样的存储顺序叫做字节序:是以字节为单位,讨论存储顺序的

  • 小端字节序存储:
    • 把一个数据的低位字节的内容,存放在低地址
    • 把一个数据的高位字节的内容,存放在高地址
  • 大端字节序存储:
    • 把一个数据的低位字节的内容,存放在高地址
    • 把一个数据的高位字节的内容,存放在低地址

计算机是按照小段字节序存储的。

写一个函数,判断当前机器用大端字节序存储还是小端

int main()
{
	因为char*类型的指针只能访问一个字节的内容
	如果是小端,那么访问到的值就是44,如果是大端,就是11
	这里注意,存放的是十六进制数,打印的时候要用%x
	
	int n = 0x11223344;
	char* p = &n;
	printf("%x", *p);
	
	return 0;
}

浮点型的存储方式

浮点型有哪些类型?

float、double、unsigned float、unsigned double

  • float与double都是有符号的类型(有正负)
  • 剩余两个是无符号型(非负数)

float ------------------------ 4个字节
unsigned float ----------- 4个字节
double --------------------- 8个字节
unsigned double -------- 8个字节

在系统中的存储方式

浮点数都可以表示为:V = (-1)S * M * 2E
解释:

  • 若S == 0,V是正数;若S == 1,V是负数
  • M是一个>=1且<2的数
  • 2E表示整数位
  • E,小数点向左移动E位(E可以使负数)
    举个例子:

十进制数:5.5
转换为二进制:101.1

  • 1*22 + 0*21 + 1*20 + 1*2-1 == 5.5
  • 101.1可以用 (-1)0 * 1.011 * 22表示 S==0,M == 1.011,E == 2
  • 这里的M和E实际用的是科学计数法表示一个二进制数
  • E的值 == 2,表示的是二进制数的小数点向左移E位
  • M是一个大于等于1小于2的数,因此保存M的值是可以不保存这个1,系统默认有这个1,因此可以节省一个bit的空间存放其他值
  • 既然用S、M、E就可以表示一个浮点数,那么系统只需存储这3个值即可
  • 下面是浮点型在内存中的存储方式

在这里插入图片描述

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值