【进阶C语言】数据的存储形式

news2025/1/6 19:50:24

文章目录

  • 一.数据类型分类
  • 二.整形的存储形式
    • 1.源码,反码,补码的关系
      • 内存中数据的存储——二进制
        • 源码,反码,补码的关系
          • 正数
          • 负数
  • 三.大小端
    • 1.概念
    • 2.例题:判断当前编译器的存储形式
  • 四.浮点数的存储形式
    • 1.二进制的补充:
    • 2.存储标准

一.数据类型分类

在这里插入图片描述

二.整形的存储形式

1.源码,反码,补码的关系

内存中数据的存储——二进制

  在(signed)int类型中大小为4个字节,1个字节是8个比特位,一个比特位是存数据的最小内存单元,也就是二进制的0/1,那四个字节就是32位二进制的数,并且最高位是符号位(因为是signed)。

源码,反码,补码的关系

正数

说明:源码,反码,补码相同。
举例1:

int a =1;

源码:00000000000000000000000000000001
反码:00000000000000000000000000000001
补码:00000000000000000000000000000001(在内存中实际存的数据)
注意:计算机并不是直接把正数的源码存进去了,而是把源码转换为补码存进去了。

负数

说明:遵循着运算逻辑——反码等于源码按位取反(符号位,也就是最高位不变,把源码中的0变成1,1变成0),补码等于反码加上1。
图解:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

特殊:int的取值范围:-2147483648 ~2147483647
负数的最小值的存储为:10000000000000000000000000000000(这是补码,并且这是语法规定的)
因此我们可以这样记住负数与正数的存储形式:

在这里插入图片描述
我们可以看出,这是一个轮回,是不是很神奇?

举例2:

int a =-1;

源码:10000000000000000000000000000001
反码:1111111111111111111111111111111111110
补码:1111111111111111111111111111111111111
在内存中:
在这里插入图片描述
说明:二进制1111表示一个f(十六进制)

三.大小端

1.概念

int main()
{
	int a = 0x11223344;
	return 0;
}

内存:
在这里插入图片描述
为什么不是:11 22 33 44呢?
这里要引出大小端的问题:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址
中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址
简单来说:大异小同。

那么这里的存储形式就为小端存储。

2.例题:判断当前编译器的存储形式

void test()
{
	int i = 1;//内存(小端存储)里面放的是:01 00 00 00
	char* p = (char*)&i;
	if (*p == 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}
}
int main()
{
	test();
	return 0;
}

四.浮点数的存储形式

1.二进制的补充:

小数位:
0.1(二进制)表示的是12的-1次方
0.01表示的是 1
2的-2次方
举例:
0.3(十进制)转化为2进制。
小数点后计算:
取整数位
0.32=0.6----0
0.6
2=1.2----1
0.22=0.4----0
0.4
2=0.8----0
0.82=1.6----1
0.6
2=1.2----1 //开始循环

1001就是循环节
其它的类似。

2.存储标准

 根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^S * M * 2^E
1.(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
2.M表示有效数字,大于等于1,小于2。
3.2^E表示指数位。
举例:

float =9.0f;

9
转化为二进制为:00000000 00000000 00000000 00001001
转化为小数:1.0012的三次方
因为是正数,可以表示为(-1)的0次方 * 1.001
2的三次方
那么:这里的S为0,M为1.001,E为3
说明:float的大小为4个字节:32比特位。
IEEE 754规定:
对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
在这里插入图片描述
这里的内存分配就是这样的。
说明:E为无符号的类型,为了存正数和负数,则规定要加上一个127。
那么这里的E为3+127=130.转换为二进制:10000010
M规定1整数忽略,在取出的时候,默认加1,这样可以多1位精度。
这里存入的M为:001其它位置默认补0
因此9.0的存储形式为:0 10000010 00100000000000000000000
转化为16进制:41 10 00 00
小端存储:00 00 10 41
补充:
1.E全为0:
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,
有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
2.E全为1:
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);
例题:从float和int视角观察9.0

int main()
{
	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	*pFloat = 9.0;
	printf("num的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	return 0;
}

结果:
在这里插入图片描述
解析:从flaot的视角观察 int类型的9.0
补码:00000000 00000000 00000000 00001001
分为三部分:0 00000000 00000000000000000001001
S:0——符号是+
E:0—— 则为1-127=-126
M:1.00000000000000000001001
写成科学计数法的形式:1.00000000000000000001001*2的-126次方——这是一个很小的数字,几乎为0。
从int类型视角观看float类型的9.0
补码:0 10000010 00100000000000000000000
int类型的补码:01000001000100000000000000000000
源码:01000001000100000000000000000000
转化为十进制:1091567616

double跟float差不多,不过分配的储存数值空间有所不同而已。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【k8s系列】kube-state-metrics中kube_endpoint_address指标

文章目录背景环境操作方法1:kube_endpoint_address_not_ready选择大于0的验证方式1验证方式2方法2:kube_endpoint_address_available选小于0的方法3:kube_endpoint_address{ready"false"}选大于0的解释参考author: ningan123date: …

java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分+微序幕就此拉开之RocketM消息中间件~整起

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 RocketMQ一、RocketMQ概念~一览无余1.消息队列有啥用?能干啥?消息队列的应用场景?2.常见的消息队列有哪些?如何进行消息队列的…

2、MySQL支持的数据类型

目录 1、整数类型 (1)fillzero:根据整数类型的长度自动添加0 (2)unsigned:非负整数 (3)bin(m):将十进制数转为m进制 2、日期时间类型 &#x…

【MySQL基础教程】函数的介绍与使用

前言 本文为 【MySQL基础教程】函数的介绍与使用 相关知识,下边具体将对字符串函数,数值函数,日期函数,流程函数等进行详尽介绍~ 📌博主主页:小新要变强 的主页 👉Java全栈学习路线可参考&…

MAXHUB+腾讯会议:为未来办公造一部动力引擎

科技领域有个规律,我们经常高估一年的变化,而低估了十年或者更长时间所可能发生的变化。不信可以做个测试,你觉得未来线上办公会怎么发展?不少朋友会说,既然线上办公是疫情到来之后的PlanB,那么随着疫情结束…

【STM32F4系列】【HAL库】【自制库】ps2手柄模块驱动

外观和电气连接 外观 手柄外观如下 接收器外观 这是接收器和底座 电气连接 需要4根连接线 单片机输出是CLK DO CS 单片机输入是DI 电源电压是3.3-5v 注意模块和单片机共地 模块不支持高速,最大时钟周期约为4us左右 因此使用软件模拟时序的方式来与模块通信 只需要将模块的4根线…

Golang Context 的几种应用场景

Golang context主要用于定义超时取消,取消后续操作,在不同操作中传递值。本文通过简单易懂的示例进行说明。 超时取消 假设我们希望HTTP请求在给定时间内完成,超时自动取消。 首先定义超时上下文,设定时间返回取消函数&#xff…

Apache POI操作百万数据excel实战方案及JDK性能监控工具Jvisualvm实战

百万数据报表概述 文章目录**百万数据报表概述****1、** **概述****2、 JDK性能监控工具介绍****2.1、 Jvisualvm概述****2.2、 Jvisualvm的位置****2.3、 Jvisualvm的使用****3、** **解决方案分析****4**、**百万数据报表导出****4.1** **需求分析****4.2** **解决方案****4.…

玩转门店管理新方法,促进营收利润加倍

门店管理的好坏是门店是否可以运营下去的重要因素,决定了门店的存亡与兴衰。以往很多门店管理者为了更简单方便,采用的是传统方式进行管理。即运用手工的方式记录和计算门店的各种信息。但是随着门店规模的扩大、商品种类的丰富、客户需求的增加以及员工…

普惠微光汇聚暖阳,招联携手奋斗者筑梦前行

撰稿 | 多客 来源 | 贝多财经 近年来,受疫情反复带来的经济下行压力,收入减少生活难以保障成了社会一大难题。值此艰难时刻,一大批爱心企业出资出力,纷纷用实际行动诠释企业的使命和担当。口罩、防护服、矿泉水、食品、药物、免费…

vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)

vue-cli区分办法 vue配置生产环境.env.production、测试环境.env.development vue配置webpack生产环境、测试环境 在使用webpack创建完vue2项目的时候,为了解决生产打包、测试打包对应的全局变量不一致的问题。 首先看一下package.json的改动: "…

MARL算法系列(1):IQL【原理+代码实现】

原文题目:Multiagent cooperation and competition with deep reinforcement learning 作者:Tampuu, Ardi and Matiisen, Tambet and Kodelja, Dorian等 发表时间:2017年 主要内容:相互独立的两个DQN智能体,竞争任务下…

2022年威胁隐私和安全的数个“罪魁祸首”

随着互联网技术的不断发展,我们对网络的信任也在不断增加,甚至将自己的私人数据委托给各种在线平台,如个人数字身份信息、银行账户、各种机密信息。网络一方面的确带来变革型的进步,但另一方面,频频曝光的数据泄露事件…

VueJs中setup的使用(下)

前言在Vue当中,父组件想要向子组件传值,是通过在父组件标签上通过自定义属性实现的,而在子组件中是通过props进行接收在Vue2.0里面,在子组件中的选项式API配置项选项中props进行接收就可以了的,在子组件中的模板中可以直接使用但在Vue3里面与Vue2.0存在一些差异,这个主要是针对…

excel文件管理:如何进行密码保护和破解? 下篇

在上篇文章中,我们提到了设置工作簿的打开权限密码、修改权限密码、保护工作簿的密码、允许编辑区域的密码,并且讲到了两种破解excel密码的方式。今天,我们书接上回,继续讲解excel中常见的密码保护和破解方式,一起来看…

浅谈屏幕适配

文章目录1. 概述2. 屏幕尺寸3. 屏幕分辨率4. 屏幕像素密度5. dp、sp、px6. mdpi、hdpi、xdpi..7. 屏幕分辨率限定符8. 最小宽度限定符8.1 获取设计图最小宽度(dp)8.2 生成对应的dimens.xml文件8.3 尺寸限定符8.4 其它9. 今日头条相关9.1 系统状态栏获取不对问题9.2 autosize1. …

Elasticsearch8.X入门实战(二)Elasticsearch集群架构

Elasticsearch集群由一个或多个节点(服务器)组成,这些节点一起保存Elasticsearch的所有数据,并提供跨所有节点的联合索引和搜索功能。集群由一个唯一的名称来标识,该名称默认为“elasticsearch”(可以在配置文件中修改)。当某个节点被设置为相同的集群名称时,该节点才能…

Docker容器的简单介绍与使用

前言:大家好,我是小威,24届毕业生,曾经在某央企公司实习,目前入职某税务公司。本篇文章将记录和分享docker容器相关的知识点。 本篇文章记录的基础知识,适合在学Java的小白,也适合复习中&#x…

如何更好地进行 Android 组件化开发——路由原理篇

前言 组件化开发的会实现代码隔离,在开发时访问不到模块的代码,降低代码耦合度。那么如何跳转组件的页面、如何进行组件间的通信是个问题。这通常会使用到 ARouter、TheRouter、WMRouter 等路由框架。可能有不少人只知道怎么去调用,并不知道…

Pod内容详情梳理

本篇是笔者的一篇读书笔记,用于梳理pod的详情,方便理解和学习,也方便后续自己查询。一、Pod的概述Pod是k8s里面典型的CR,从它的元数据来看,具有所有CR的基本数据构成,分别是 version、kind,以及…