深度剖析数据在内存中的存储——C语言篇。

1.  数据类型介绍

我们首先要了解C语言中都有哪些数据类型。

整形家族:

char 

   unsigned char

   signed char

short 

  unsigned short 

  signed short

int 

  unsigned int 

  signed int 

long 

  unsigned long 

  signed long

浮点型家族

float 

double 

构造类型

 数组类型 

结构体类型 struct

枚举类型 enum

联合类型 union

指针类型

int *pi;

char *pc

float *pf

void *pv

空类型

void 表示空类型(无类型)

通常用于函数的返回类型、函数的参数、指针类型等。

2.整形在内存中的存储

 首先我们要知道变量在内存中存储是需要开辟空间的,而空间的大小由不同的数据类型决定的。

  那数据到底在内存中是如何存储的。

我们需要了解以下三个概念:原码  反码  补码。

三种表示方法均有符号位,数值位,符号位‘0’表示正,‘1’表示负。

 原码

直接将数值按照正负数的形式翻译成二进制。

反码

符号数不变,其他位依次按位取反。

补码

反码加一,即可得到补码。             

正数的原,反,补相同。

对于整形来说,数据存放内存中的其实是补码。

例如:

 

我们可以看到a , b 分别存储的是补码。

但是顺序有些异常。

这里我们必须提到 大端字节序和 小端字节序的概念了。

3.大小端字节序

大端字节序:大端存储模式 ,指的是数据的低位保存在内存的高地址处,数据的高位保存在内存的低地址处。

小端字节序:小端存储模式 ,指的是数据的低位保存在内存的低地址处,数据的高位保存在内存的高地址处。

机器的字节序是大端还是小端,这要看具体的机器。

我们可以用一个程序来判断当前程序的字节序

 设 i 为 1。

二进制为 00000000 00000000 00000000 00000001

大端字节序  00 00 00 01

小端字节序 01 00 00 00

取地址 i   再使用(char*)强制类型转换,再解引用,访问第一个字节内容,进而判断字节序。

4.浮点型在内存中的存储

储存规则

浮点型的储存规则与整形截然不同,有本质的区别。

根据国际标准IEEE,任意一个二进制浮点数V可以表示为:

(-1)^S*M*2^E

(-1)^S表示符号位,S=0时,V为正数,S = 1时,V为负数。

M表示有效数字,大于等于1,小于2

2^E表示指数位

例如十进制的 6 二进制为110,(-1)^0*1.10*2^2

IEEE规定

对于32位的浮点数,最高位是符号位S,紧接着的8位是指数E,剩下的23位为有效数字M

 对于64位浮点数,最高位是符号位S,紧接着11位是指数E,剩下的52位是有效数字。

IEEE对于有效数字M和指数E,还有一些特殊规定,解释起来有些繁琐,简单说一下结论,有兴趣可自行了解。

IEEE 754规定:在计算机保存M时,默认第一位为1,因此可被省,等到读取时直接再补上,这样可以保存更多的有效数字。

指数E  为无符号整数(unsigned int )

科学计数法中E存在负数,所以规定存入内存中必须加上一个中间数,127(32位),1023(64位)。

取出E时。

E不为全0 或全1时,E 减去127(1023)

E为全0时,E等于1-127(1-1023)

有效数字不再加上第一位的1,而是0.xxxxxxxx的小数,表示正负0或者接近0的小数。

E为全1时 :如果有效数字全为0,表示正负无穷大。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值