当前位置: 首页 > news >正文

深入浅出C语言——数据在内存中的存储

文章目录

  • 一、数据类型详细介绍
    • 1. C语言中的内置类型
    • 2. 类型的基本归类:
  • 二. 整形在内存中的存储
    • 1. 原码、反码、补码
    • 2. 大小端
  • 三.浮点数存储规则


一、数据类型详细介绍

1. C语言中的内置类型

   C语言的内置类型有char、short、int、long、long long、float、double,内置类型所占存储空间的大小如下所示:

char 		//字符数据类型 	1
short 		//短整型     	2
int 		//整形        	4
long 		//长整型    		4/8
long long 	//更长的整形  	8
float 		//单精度浮点数    4
double 		//双精度浮点数   	8

C语言中类型的意义

  1. 使用这个类型开辟内存空间的大小,大小决定了使用范围。
  2. 如何看待内存空间的视角。

2. 类型的基本归类:

整形家族:

charunsigned charsigned char

  属于整形家族, 因为char虽然是字符类型,但是字符类型存储的时候,存储的是字符的ASCII码值,ASCII值是整数。另外,当在编译器中输入char c1;时,c1到底是有符号还是无符号的是不确定的,是取决于编译器实现的,一般情况下char相当于singed char。有符号字符类型取值范围是-128 ~ 127,无符号字符类型取值范围是0~255。

shortunsigned shortsigned short

  属于整数家族,short等价于signed short,取值范围是 -32768~32767,unsigned short是无符号的short,取值范围是0 ~ 65535。

intunsigned intsigned int

  属于整数家族,int是有符号的int等价于singed int。

longunsigned longsigned long

  属于整数家族,long是有符号的long等价于signed long。


数据的最高位

  有正负的的数据可以放在有符号的变量中,只有正数的数据可以放在无符号的变量中。如果是有符号的数据,最高位表示的是符号位。最高位是0,表示正数;最高位是1,表示负数,如果对于无符号的数据来说,最高位也是数据位。


浮点数家族:

floatdoublelong double

构造类型:

结构体类型枚举类型联合类型
structenumunion

指针类型

int* pichar* pcfloat* pfvoid* pv

空类型:

   void 表示空类型/无类型,通常应用于函数的返回类型、函数的参数、指针类型。


二. 整形在内存中的存储

   一个变量的创建是要在内存中开辟空间的,空间的大小是根据不同的类型而决定的。


1. 原码、反码、补码

   计算机中的整数有三种表示方法,即原码、反码和补码。正数的原、反、补码都相同;负数的原码、反码、补码需要计算,负数的原码直接将数值按照正负数的形式翻译成二进制就可以,反码则将原码的符号位不变,其他位依次按位取反就可以得到了,补码是将反码+1就得到补码。对于整形来说:数据存放内存中其实存放的是补码。

int main()
{int a = 10;//整型值//原码:00000000000000000000000000001010//反码:00000000000000000000000000001010//补码:00000000000000000000000000001010int b = -10;//整型值//原码:10000000000000000000000000001010//反码:11111111111111111111111111110101//补码:11111111111111111111111111110110//      1111 1111 1111 1111 1111 1111 1111 0110//      F    F    F     F   F     F    F   6//      0x ff ff ff f6 存储到内存中return 0;
}

为什么数据在内存中放的是补码

   在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。


2. 大小端

  大小端即大小端字节序存储。大端字节存序储存储模式是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端字节序存储模式是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。


案例

int a = 0X11223344;在内存中存储

在这里插入图片描述


为什么会有大小端模式之分?

  因为在计算机系统中是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型。另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题,因此就导致了大端存储模式和小端存储模式。常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式,很多的ARM和DSP都为小端模式,有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。


判断当前机器的字节序

int check_sys()
{int a = 1;return *(char*)&a;
}
int main()
{int ret = check_sys();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

三.浮点数存储规则

   整数和浮点数的存储方式是有差异的,浮点数家族包括: float、double、long double 类型。根据国际IEEE754(标准电气和电子工程协会) ,任意一个二进制浮点数V可以表示成下面的形式:(-1)^S * M * 2^E(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。M表示有效数字,大于等于1,小于2;2^E表示指数位。


举例

   十进制的5.0,写成二进制是101.0 ,相当于 1.01×2^2 。那么按照上面V的格式,可以得出s=0,M=1.01,E=2。

   十进制的-5.0,写成二进制是 -101.0 ,相当于 -1.01×2^2 。那么,s=1,M=1.01,E=2。


IEEE 754标准

  IEEE754标准规定,对于32位的浮点数(float类型),最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
在这里插入图片描述
  IEEE754标准规定,对于64位的浮点数(double),最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
在这里插入图片描述


保存有效数字M

  M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。


保存指数E

  至于指数E,情况就比较复杂。首先,E为一个无符(unsigned int),这意味着,如果E为8位,它的取值范围为0 ~ 255;如果E为11位,它的取值范围为0~2047。但是,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。


取出指数E

指数E从内存中取出还可以再分成三种情况:

1.E不全为0或不全为1

  当E不全为0或不全为1,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。比如:0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为: 0 01111110 00000000000000000000000

2.E全为0

  当E全为0时,浮点数的指数E等于1-127(或者1-1023)即为真实值, 有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

3.E全为1

  当E全为1时,如果有效数字M全为0,表示±无穷大,正负取决于符号位s


浮点数的比较

  浮点数进行比较的时候不能直接用==去比较,因为浮点数在内存中储存有误差,应该比较浮点数直接的差值是否在允许的精度范围之内。比如一个完整的比较相等的逻辑可以为:

const double eps = 1e-8;
#define Equ(a, b) ((fabs((a)-(b))<(eps))

相关文章:

深入浅出C语言——数据在内存中的存储

文章目录一、数据类型详细介绍1. C语言中的内置类型2. 类型的基本归类&#xff1a;二. 整形在内存中的存储1. 原码、反码、补码2. 大小端三.浮点数存储规则一、数据类型详细介绍 1. C语言中的内置类型 C语言的内置类型有char、short、int、long、long long、float、double&…...

在 Centos 上在线安装 GitLab

作为程序员&#xff0c;其中一个愿望是拥有一个自己的代码存储库。在支持私有部署的代码存储库产品中&#xff0c;GitLab 是比较著名的了&#xff0c;所以今天我总结了一下在 Centos 上安装 GitLab 的过程。 依赖 基础依赖 首先&#xff0c;需要安装部分基础的依赖&#xff…...

模型解释性:SHAP包的使用

本篇博客介绍另一种事后可解释性方法&#xff1a;SHAP(SHapley Additive exPlanation)方法。 1. Shapley值理论 Shapley值是博弈论中的一个概念&#xff0c;通过衡量联盟中各成员对联盟总目标的贡献程度&#xff0c;从而根据贡献程度来进行联盟成员的利益分配&#xff0c;避免…...

算法训练营 day45 动态规划 0-1背包理论 分割等和子集

算法训练营 day45 动态规划 0-1背包理论 分割等和子集 0-1背包理论 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 在下面的讲解中&…...

SSM框架

1.mybatis的底层原理 本质上就是使用反射和动态代理来实现对应的映射关系 2.日志级别 3.传递参数 单个参数的传递和多个参数的传递 Emp selectOne(Param(“xingming”) String name); List selectByCondition(Param(“name”) String name,Param(“sal”) double sal); 4.#和…...

教育行业需要什么样的客服系统?

某教育公司拥有素质教育、成人教育、智慧教育等多个业务板块&#xff0c;日常通过电商、线上媒体、线上线下授课等方式进行业务开展和品牌宣传&#xff0c;取得了非常不错的成绩&#xff0c;受到了很多人的好评反馈。 对于这样一个教育公司&#xff0c;客户来源广泛&#xff0…...

花房集团任命新首席财务官:已跌破IPO发行价,活跃用户下滑

上市刚满2个月&#xff0c;花椒母公司花房集团&#xff08;HK:03611&#xff09;的高管就发生了变更。2023年2月12日&#xff0c;花房集团披露的公告显示&#xff0c;董事会宣布赵磊为该公司首席财务官&#xff08;CFO&#xff09;&#xff0c;自2023年2月10日起生效。 据贝多…...

儿童绘本馆图书借阅租赁知识付费小程序源码交流

1.分类图书 2.书单推荐 4.会员卡次、期限购买 5.借阅时间选择 6.积分签到 7.优惠Q领取 前端uniapp开发 后端thinkphp开发 完全开源 <template> <view class"sp-section sp-index"> <!-- search --> <view class&qu…...

Vue3 中 axios 的安装及使用

目录前言&#xff1a;一、什么是 axios &#xff1f;二、Axios 的配置项三、Axios 的请求方式四、自定义创建实例五、Axios 请求错误处理六、Axios 解决跨域问题七、Axios 请求案例随机笑话大全总结&#xff1a;前言&#xff1a; 在编写vue里的项目时&#xff0c;必须要用和后台…...

Django设计模式以及模板层介绍

MVC和MTV 传统的MVC作用&#xff1a;降低模块间的耦合度&#xff08;解耦&#xff09;Django的MTV模式 作用&#xff1a;降低模块间的耦合度&#xff08;解耦&#xff09;什么是模板 1、模板是可以根据字典数据动态变化的html网页2、模板可以根据视图中传递的字典数据动态生成相…...

Linux信号一门搞定

1.信号是什么&#xff1f; 信号其实就是一个软件中断。 例&#xff1a; 输入命令&#xff0c;在Shell下启动一个前台进程。用户按下Ctrl-C&#xff0c;键盘输入产生一个硬件中断。如果CPU当前正在执行这个进程的代码&#xff0c;则该进程的用户空间代码暂停执行&#xff0c;…...

手撸一个动态Feign,实现一个“万能”接口调用

Feign&#xff0c;在微服务框架中&#xff0c;是的服务直接的调用变得很简洁、简单&#xff0c;而不需要再编写Java Http调用其他微服务的接口。 动态feign 对于fegin调用&#xff0c;我们一般的用法&#xff1a;为每个微服务都创建对应的feignclient接口&#xff0c;然后为每…...

Linux Capabilities 入门

目录 Linux capabilities 是什么&#xff1f; capabilities 的赋予和继承 线程的 capabilities Permitted Effective Inheritable Bounding Ambient 文件的 capabilities Permitted Inheritable Effective 运行 execve() 后 capabilities 的变化 案例 Linux capab…...

驱动 day6

关于设备树的理解&#xff1a; 设备树&#xff08;Device Tree&#xff09;是一种用于特定硬件设备的解释语法树。它用来表示存储有关主板硬件和CPU架构信息的数据在内核中的传递格式&#xff0c;使内核可以更好地了解硬件并支持它们&#xff0c;而不必编写固定的代码。设备节点…...

附录2-tensorflow目标检测

源码来自作者Bubbliiiing&#xff0c;我对参考链接的代码略有修改&#xff0c;网盘地址 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;dvb1 目录 1 参考链接 2 环境 3 数据集准备 3.1 VOCdevkit/VOC2007 3.2 model_data/voc_classes.txt 3.3 voc_an…...

常见的EMC问题

电磁兼容设计的目的就在于满足产品功能要求、减少调试时间&#xff0c;使产品满足电磁兼容标准的要求&#xff0c;并且使产品不会对系统中的其它设备产生电磁干扰。 电磁兼容设计中常见的问题有哪些&#xff1f; 1、电磁兼容设计可以从电路设计&#xff08;包括器件选择&…...

Redis内存存储效率问题

目录 内存碎片是如何形成的&#xff1f; 如何判断是否有内存碎片&#xff1f; 如何清理内存碎片&#xff1f; INFO命令 面向 Prometheus 的 Redis-exporter 监控 实习期间&#xff0c;了解到&#xff0c;企业级开发中多个项目使用Redis&#xff0c;运行Redis实例的有可能是…...

3.28 haas506 2.0开发教程-example-蓝牙多设备扫描(仅支持M320,HD1)

haas506 2.0开发教程-example-蓝牙多设备扫描案例说明蓝牙信息克隆1.手机蓝牙改名信息克隆代码测试案例说明 开发板扫描蓝牙设备&#xff0c;获取并打印蓝牙设备mac地址。mac地址每个设备不同&#xff0c;且不能更改。本案例仅适用于M320开发板和HD1-RTU。案例使用手机与iBeac…...

C语言经典编程题100例(41~60)

目录41、习题4-4 特殊a串数列求和42、习题4-6 水仙花数43、习题4-7 最大公约数和最小公倍数44、习题7-5 找鞍点45、练习5-1 求m到n之和46、练习5-2 找两个数中最大者47、练习5-3 数字金字塔48、习题5-1 符号函数49、习题5-2 使用函数求奇数和50、习题5-3 使用函数计算两点间的距…...

git日常使用命令

实习这段时间使用了很多git指令来提交代码&#xff0c;简单记录一下日常使用的指令&#xff1a; 提交代码通常顺序&#xff1a; 1.git status 查看本地修改项 2.git add . 提交全部文件 &#xff08;这个 .是全部文件&#xff09;到暂存区 3.git commit -m ‘本次提交的说明’…...

ES6对象展开运算符浅拷贝or深拷贝

ES6中提出的对象展开运算符“…”就是用来展开元素的。有了它就不用代码循环遍历了&#xff0c;偷懒专用。 1. 合并数组 展开原有数组中的所有元素&#xff0c;可以合并成一个新的数组。 var a[1,2,3]; var b[4,5,6]; var c[...a,...b]; console.log(c) // 输出&#xff1a;…...

leaflet 上传包含shp的zip文件,在map上解析显示图形(059)

第059个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中本地上传包含shp的zip文件,利用shapefile读取shp数据,并在地图上显示图形。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果加载shapefile.js方式安装引用jszip(…...

CAN总线详细介绍

1.1 CAN是什么&#xff1f; CAN 最终成为国际标准 &#xff08; ISO11898(高速应用)和 ISO11519&#xff08;低速应用&#xff09;&#xff09;&#xff0c;是国际上应用最广泛的现场总线之一。 1.2 CAN总线特点 多主方式: 可以多主方式工作&#xff0c;网络上任意一个节点…...

python如何完成对 Excel文件的解密后读取?

通常为了防止重要的Excel文件数据内容的泄露&#xff0c;需要对文件整体进行加密与解密的操作。 对于文件的加解密过程&#xff0c;python也有很多非标准库来帮助我们完成操作&#xff0c;这里主要说明如何完成对Excel文件的解密与读取操作。 这里我们使用到的是msoffcrypto-…...

微服务实战--高级篇:RabbitMQ高级

服务异步通信-高级篇 消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一步都可能导致消息丢失&#xff0c;常见的丢失原因包括&#xff1a; 发送…...

autoCAD2022 - 设置新的原点

文章目录autoCAD2022 - 设置新的原点概述笔记UCS原点设置功能的菜单位置ENDautoCAD2022 - 设置新的原点 概述 上次整板子的dxf时, 原来的原点不合适, 想调整一下. 当时整完了, 没记录. 这次用的时候, 又找半天… 设置新原点的功能, 不在顶部菜单中, 而是在视图右上角的UCS图标…...

spring boot 配置 mybatis-plus多数据源

简介Mybatis-puls 多数据源的使用&#xff0c;采用的是官方提供的dynamic-datasource-spring-boot-starter包的 DS 注解&#xff0c;具体可以参考官网&#xff1a;https://gitee.com/baomidou/dynamic-datasource-spring-boot-starterpom.xml文件引入如下依赖主要引入dynamic-d…...

独立产品灵感周刊 DecoHack #047 - 安卓手机上最有用的APP

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。&#x1f4bb; 产品推荐 1. Bouncer Tempor…...

【面试题】JavaScript中递归的理解

大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库递归 RecursionTo iterate is human, to recurse, divine. 理解迭代&#xff0c;神理解递归。本文会以 JavaScript为主、有部分 Rust 举例说明。…...

PyTorch学习笔记

PyTorch学习笔记&#xff08;一&#xff09;&#xff1a;PyTorch环境安装 往期学习资料推荐&#xff1a; 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 安装参考&#xff1a; 1.视频教程&#xff1a;3分钟深度学习【环境搭建】CUDA Anacon…...

做网站一般需要多久/全球疫情最新消息

如何使用远程服务器跑项目 内容精选换一换远程桌面协议(Remote Desktop Protocol&#xff0c;RDP)&#xff0c;是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows弹性云服务器。从管理控制台下载的RDP文件对应唯一的云服务器&#xff0c;当前RDP文…...

如今做哪个网站能致富/视频外链在线生成

http://www.opengpu.org/forum.php?modviewthread&tid7164&extrapage%3D1火影忍者鸣人 疾风传 终级风暴2以超越动画作为目标的游戏视觉效果。去年&#xff0c;被看作达到动画般的画面品质的[火影忍者鸣人终级风暴]&#xff0c;与其说是震惊了游戏界&#xff0c;不如说…...

微软哪个软件做网站/网站优化网

Robot Operating System (ROS)学习笔记3---键盘控制 搭建环境&#xff1a;XMWare Ubuntu14.04 ROS&#xff08;indigo&#xff09; 转载自古月居 转载连接&#xff1a;http://www.guyuehome.com/253 一、创建控制包 1 catkin_create-pkg smartcar_teleop rospy geometry_msg…...

上海建网站公司排名/google官网入口注册

MQTT代理&#xff08;服务器开发&#xff09;本例将基于JMQTT进行二次开发作为MQTT代理&#xff08;broker服务器&#xff09;。由于JMQTT需要配置启动环境变量&#xff0c;比较麻烦并且对初学者不利&#xff0c;环境变量是为了系统运行更快而设置的&#xff0c;jmtqq不是频繁读…...

小程序入口文件/window优化大师

shell脚本批量创建用户有些面试题中会问到批量创建用户的题目&#xff0c;大体是用循环去进行创建&#xff0c;但有时也会有一些额外的附加条件&#xff0c;一起来看看今天的知识点吧。需求&#xff1a;1、自定义用户&#xff0c;不要有特殊字符&#xff1a;user01,user022、最…...

深圳大浪网站建设/产品怎么在网上推广

1、为什么要使用YARN&#xff1f; 为了提升集群的利用率、资源统一管理&#xff0c; 使用YARN为上层应用提供统一的资源管理和调度的平台。 2、YARN的优势&#xff1f; 资源的统一管理和调度&#xff1a; 集群中所有节点的资源(内存、CPU、磁盘、网络等)抽象为Container。计算…...