当前位置: 首页 > 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…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...