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

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

 

reference

n.提及,谈到;参考,查阅;(引自书或诗歌的)引言,引文;

引文的作者,参考书目;(帮助或意见的)征求,征询;

(为方便查询所用的)标记,编号;推荐信,介绍信;介绍人,推荐人

adj.参考的,用于查阅的;文献索引的,参照的

v.列出……的参考书目;提及,提到;引用,参照(某书或某作者)

1.C语言的数据类型

为什么每种语言都会规定数据类型呢?

emmm,请见我的下一篇文章,嘻嘻。

(1).数据类型分类

数据类型总的来说分为两类:内置类型、自定义类型、指针类型和空类型

2.整数在内存中的存储 

存储方式:

二进制的存储的方式一共有三种,原码、反码和补码,而整数是以二进制补码的形式进行存储的。

整数又分为正数和小数,导致它们的原反补码关系不同,具体如下:

正数:

        正数的原码、反码和补码相同,原码就是指这个数的二进制形式。

负数:

  • 负数的反码就是原码的符号位变,其它位按位取反,而补码就是在反码的基础上再加1。
  • 如果反码想得到原码就是反码减一。
  • 如果补码想要得到原码,取反加一或者减一取反。
  • 原因:

原因:CPU只有加法器,面对减法时无法计算,这时就需要将正数变为负数,进行加法计算,为了使得负数的符号位和数值位可以进行统一处理,这时就需要使用补码。具体详细内容请查看我的下一篇文章:《补码的由来》

例子1:

正数和负数的补码

例子2: 

补码转到原码

常见类型的范围大小:

当我们知道了整数是如何在内存中存储的了,下面我们来讨论一下有符号类型与无符号类型的差异,以及可能会犯的错误。

整形int

整形int按符号分为无符号类型和有符号类型,无符号类型就是指最高位表示值,有符号类型就是指最高位表示正负

大小:都是4个字节

范围:有符号[-32768~32767]        无符号[0~4294967295(2^32-1)]

可见类型的数据是有范围的,如果在使用时不注意类型的范围随意使用就会造成错误,比如下面这个例子,循环结束的条件设置为大于等于,而i本身就是无符号的数字,那么循环就会以继续下去,这就是不注意不同类型的范围所造成的结果。

字符类型

同上,字符类型按符号分为无符号类型和有符号类型,无符号类型就是指最高位表示值,有符号类型就是指最高位表示正负

大小:都是1个字节

范围:有符号[-128~127]        无符号[0~255]

同样,如果不注意它的范围也会出现问题,就如下面的例子,无符号的char类型的范围是不可能大于255的。

可见,在使用超级大的数值或者无符号类型时,一定要注意类型自身的范围!!!

3.浮点数在内存中的存储

标准:

根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式为:V   =  (−1) ^(S) * M * 2^(E),从而浮点数在二进制中只存S,M,E。

注:其实V   =  (−1) ^(S) * M * 2^(E)就是二进制的科学计数法。

科学计数法:

        科学计数法通常用于科学和工程领域,是一种有效的数学工具,它不仅使数值的表示更加简洁,在进行科学计算和数据分析时具有重要作用。【补充】

        科学计数法在不同进制下都有相应的表达方式,每种进制都遵循类似的结构和原则,但在具体的数字表示上会有所不同。【补充】

十进制:

  • 科学计数法是一种表示比较大的数或比较小的数的方法,它通过使用指数来简化表示。
  • 科学计数法通常以M*10^(E)的形式表示,其中M是一个在1到10之间的数,E是一个整数
  • 10又被称作基数,基数是指数部分的底数,由R表示。
  • 这种表示方法方便地表示非常大或非常的数,同时也便于进行计算和比较
  • 十进制的科学计数法是最常的一种形式。例如,光速为3 × 10^8米/秒太阳质量约为2 × 10^30千克。【补充】

二级制:

        二进制的科学计数法与十进制的类似,只是使用2作为基数。

  • V                  要存储的浮点数
  • S                  符号位浮点数的正负,S为1或0
  • M                 尾数,用二进制下科学计数法表示时的数值,大小范围:1 =< M < 2
  •                  指数,二进制下科学计数法2的次方个数
  • R                  基数,对于十进制数的基数则是10,对于二进制数的基数则是2

存储方式:

4字节:

        对于占4个字节的浮点数,32个比特位,方式如下:

8字节:

        对于占8个字节的浮点数,64个比特位,方式如下:

  • 注意因为科学计数法中的E可能为负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023
  • 注意为啥加的是127和1023,因为E为负数时,2^(-127)已经非常小了接近0了,就规定把-127作为E的下限,同时128也是E的上限;对于8个字节的也同理,都是人为规定的
  • 注意存储的是M小数点后面数字,1是不存储在位里面的
  • 如果是1xx.xxxxx的情况,向前进,变成1.xxxxxxxxxxxx的形式,E为正值
  • 如果是0.xxxxxxxxx的情况,向后进位,变成1.xxxxxxxxxxxx的形式,E为负值
  • 注意真实存的不是E,存的也不是M

例子:

a.float n = 8.5;

第一步.将十进制的数字转换为二进制的数字

先介绍一下小数怎么转二进制,如下

        我们都知道整数每一位的权重是从2的0次方依次增加,那么浮点后面的数每一位的权重以2的-1次方依次递减,那么,0.5用二进制表示为0.1,0.25就是0.01等等。

8 = 1000,0.5=1 ,那么8.5 = 1000.1【转换就是整数小数都转】

第二步.用二进制下的科学计数法表示

1000.1 = 1.0001 * 2^(3)

【1000.1小数点往左移3位也就是2的3次方】

第三步.存储

此时,S = 0;E为3,加上127,转二进制是1000 0010;M存小数点后面二进制数就是0001

就是:0 10000010 00010000000000000000000

注意0001是从前往后存,存完后剩余位置的补0!!!!!!!!!!

b.float b = - 5.0

【负数去掉负号按照正数计算,将S赋1就可】

第一步.将十进制的数字转换为二进制的数字

5 = 0011,0 = 0,5.0 = 11.0

第二步.用二进制下的科学计数法表示

11.0= 1.10 * 2^(1)

第三步.存储

此时,S = 1;E为1,加上127,转二进制就是1000 0001;M存小数点后面二进制数就是0

就是:1 10000001 000000000000000000000000

特殊情况

上面我们讨论的都是E+127不全为0或不全为1的情况,下面我们讨论两种特殊的情况 。

c.E+127全为0

  • E+127全为0的时候,E=1-127,说明2^(E)这个数字是一个接近于0很小的数
  • 那么就规定小数点左边为0,不进行+1的操作。

d.E+127全为1

  • E+127全为1说明这个数值很大,2^(E)很大,十进制数字就是无穷大

4.大小端字节序

当超过1个比特位,有多个比特位时,我们就会考虑这么多的位的存放顺序,哪个位在前?哪个位在后?那么就规定出了一套存序法则,就是大小端字节序,大小端字节序是指的数据在内存中存储的方式不同。

首先在这之前,我们先给大家普及一个数字的低位高位知识:

        比如一个十进制数字1234,这里的4就是个位,3就是十位,2就是百位,1就是千位,那么个位就是低位,依次向前十百千,千就是最高位,那么对应的一个二进制数101,1就是个位,0就是2位,1就是4位;

        你猜我为啥和你说这些?就是因为大小端字节序的存储就是按照数字的低位存在高地址位和低地址位来划分的,下面我就为大家介绍大小端字节序。


大端字节序

定义:

        大端字节序存储是指将数据的低位存储在高地址处,而将数据的高位存储在低地址处

大端字节序

小端字节序

定义:

        大端字节序存储是指将数据的低位存储在低地址处,而将数据的高位存储在高地址处

小端字节序

例子

判断大小端字节序(VS的环境)

#include<stdio.h>
int main()
{int a = 1;//思路:要判断大小端只需要看它的低地址处存的是低位还是高位,地址是低地址内存单元的地址//那么拿出它的地址访问一个字节是1则为小端字节序,0则是大端字节序int b = *(char*)&a;if (b == 1)printf("小段字节序\n");if (b == 0)printf("大端字节序\n");return 0;
}


本章内容结束,下章见,拜拜!!!

相关文章:

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

reference n.提及&#xff0c;谈到&#xff1b;参考&#xff0c;查阅&#xff1b;&#xff08;引自书或诗歌的&#xff09;引言&#xff0c;引文&#xff1b; 引文的作者&#xff0c;参考书目&#xff1b;&#xff08;帮助或意见的&#xff09;征求&#xff0c;征询&#xff1b…...

管理公司员工上网行为的软件都有哪些?

随着互联网的飞速发展&#xff0c;企业面临的网络安全威胁也日益加剧。为了保护企业数据安全、提高工作效率&#xff0c;上网行为管理系统及其相关管理软件应运而生。 未来&#xff0c;随着技术的不断进步和网络安全威胁的不断演变&#xff0c;上网行为管理系统及其管理软件将不…...

手撕C语言题典——逆序输出

有这样一个问题&#xff1a;读入一些整数&#xff0c;逆序输出到一行中。已知的是该整数不超过100个。我们该怎么办呢&#xff1f;我们先将这些整数循环输入&#xff0c;输入每个整数之后&#xff0c;我们只能将数组存下来&#xff0c;而这个地方就是数组。 本章可能用到的知识…...

如果保障服务器的安全

如果保障服务器的安全 一、修改它最开始的密码&#xff0c;后期也要一直更换。一般如果有客户来了服务器的话&#xff0c;服务器厂商都会提前把所有的系统都装好&#xff0c;之后再把这个权限交到用户的手里。很多用户可能在这方面不会特别注意&#xff0c;密码也不修改&#x…...

【SQL】1280. 学生们参加各科测试的次数 (笛卡尔积)

前述 知识点回顾&#xff1a;数据库中的四大join & 笛卡尔乘积&#xff08;以MySQL为例&#xff09; 笛卡尔积的两种写法 select * from stu,class; select * from stu cross join class; 题目描述 leetcode题目&#xff1a;1280. 学生们参加各科测试的次数 Code 写法…...

高企认定中科技成果转化是什么呢?

其实&#xff0c;这是一个流程&#xff0c;可以用下面的分段进程来表示&#xff1a;企业开展科研立项—科研立项得到科研结果—科研结果用于产品的生产—新产品品质提高带动了销售的增加。 上面的流程&#xff0c;其实是高企审核的核心&#xff0c;不仅仅关系到了量化打分。更…...

第十二届蓝桥杯省赛CC++ 研究生组-货物摆放

还是整数分解问题,注意n本身也是约数 #include <iostream> int main(){printf("2430");return 0; }#include <iostream> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; const ll n 2021041820210418LL…...

基于SpringBoot的学生成绩管理系统

基于SpringBootVue的家教管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 系统功能结构展示 登录界面图 现今&#xff0c;越来越多的人乐于选择一项合适的管理方案&#xff0c;但是普通用户往往受到管理经验地限制&…...

旅游管理系统 |基于springboot框架+ Mysql+Java+Tomcat的旅游管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…...

SpringBoot(整合MyBatis + MyBatis-Plus + MyBatisX插件使用)

文章目录 1.整合MyBatis1.需求分析2.数据库表设计3.数据库环境配置1.新建maven项目2.pom.xml 引入依赖3.application.yml 配置数据源4.Application.java 编写启动类5.测试6.配置类切换druid数据源7.测试数据源是否成功切换 4.Mybatis基础配置1.编写映射表的bean2.MonsterMapper…...

GAMES104-现代游戏引擎 1

主要学习重点还是面向就业&#xff0c;重点复习八股和算法 每天早上八点到九点用来学习这个课程 持续更新中... 第一节 游戏引擎导论 第二节 引擎架构分层 引擎是分层架构的 编辑器功能层资源层核心层平台层 越底层的代码越稳定越坚固&#xff0c;越上层的代码越灵活越开…...

idea 开发serlvet篮球秩序册管理系统idea开发mysql数据库web结构计算机java编程layUI框架开发

一、源码特点 idea开发 java servlet 篮球秩序册管理系统是一套完善的web设计系统mysql数据库 系统采用serlvetdaobean mvc 模式开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 servlet 篮…...

【深度学习】NestedTensors

文章目录 NestedTensorsWhy NestedTensor初始化 NestedTensorNestedTensor 操作reshape转置查看维度其他 NestedTensors DETR 中常见的数据格式为 NestedTensors&#xff0c;那么什么是 NestedTensors 呢&#xff1f; NestedTensor&#xff0c;包括 tensor 和 mask 两个成员&a…...

【网络】负载均衡

OSI模型每一层的负载均衡 在OSI模型中&#xff0c;每一层的负载均衡具体如下&#xff1a; 1. 第二层&#xff08;数据链路层&#xff09;&#xff1a;数据链路层的负载均衡通常涉及对MAC地址的操作。在这一层&#xff0c;可以使用虚拟MAC地址技术&#xff0c;外部设备对虚拟MA…...

dataGridView 绑定List 显示内容不刷新

绑定后,原list值变动,显示内容会刷新 绑定后,list新添加的值时不会显示到界面,需要重新绑定list 微软的Bug 参考代码 public class Student{public string Name { get; set; }}List<Student> list new List<Student>();private void Form2_Load(object sender,…...

VR历史建筑漫游介绍|虚拟现实体验店|VR设备购买

VR历史建筑漫游是一种利用虚拟现实技术&#xff0c;让用户可以身临其境地参观和探索历史建筑的体验。通过VR头显和相关设备&#xff0c;用户可以在虚拟环境中自由移动和互动&#xff0c;感受历史建筑的真实氛围和文化内涵。 在VR历史建筑漫游中&#xff0c;您可以选择不同的历史…...

Linux查看硬件型号详细信息

1.查看CPU &#xff08;1&#xff09;使用cat /proc/cpuinfo或lscpu &#xff08;2&#xff09;使用dmidecode -i processor Dmidecode 这款软件允许你在 Linux 系统下获取有关硬件方面的信息。Dmidecode 遵循 SMBIOS/DMI 标准&#xff0c;其输出的信息包括 BIOS、系统、主板、…...

【鸿蒙HarmonyOS开发笔记】通知模块之发布基础类型通知,内含如何将图片变成PixelMap对象

通知简介 应用可以通过通知接口发送通知消息&#xff0c;终端用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用。 通知常见的使用场景&#xff1a; 显示接收到的短消息、即时消息等。 显示应用的推送消息&#xff0c;如广告、版本更新等。 显示当前正…...

外包干了1个月,技术明显进步。。。

我是一名大专生&#xff0c;自19年通过校招进入湖南某软件公司以来&#xff0c;便扎根于功能测试岗位&#xff0c;一晃便是近四年的光阴。今年8月&#xff0c;我如梦初醒&#xff0c;意识到长时间待在舒适的环境中&#xff0c;已让我变得不思进取&#xff0c;技术停滞不前。更令…...

鸿蒙开发实战:【Faultloggerd部件】

theme: z-blue 简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native In…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...