【C语言】数据存储篇,内存中的数据存储----C语言整型,浮点数的数据在内存中的存储以及大小端字节序【图文详解】

欢迎来CILMY23的博客喔,本篇为​【C语言】数据存储篇,内存中的数据存储----C语言整型,浮点数的数据在内存中的存储以及大小端字节序【图文详解】,感谢观看,支持的可以给个一键三连,点赞关注+收藏。 

 前言

C语言中整型的存储是原码反码补码,那么浮点数的存储又是什么样的呢?本篇将以整型的数据存储开始,带大家了解C语言中数据的存储。

目录

 一、整型的存储

二、大小端字节序

三、练习题

四、浮点数的数据存储


 一、整型的存储

在C语言中,整型数据是以二进制的形式存入内存中的,那在c语言中能对二进制进行操作的有几个操作符,~ ,&,|,^,<<,>>。整数的二进制表示⽅法有三种,即原码、反码和补码,三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位最高位的⼀位是被当做符号位,剩余的都是数值位。

   符号位:

正整数的原码反码补码都相同

例如:4

它的原码,反码,补码都为

00000000 00000000 00000000 00000100

负整数的原码反码补码则表示不一样
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。 

例如以下负四这个例子: 

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

二、大小端字节序

虽然整型数据是按二进制存入内存的,但是在vs的编译器上却采用的是十六进制表示。

例如:

这是整型四的表示,在内存中的地址是 0x00CFFC8C

但是为什么vs的表示是04在前面的呢? 

这就涉及大小端字节序了,大小端字节序分大端字节序和小端字节序,字节序说的就是字节的顺序,当一个字节超过一个数值大小的时候,就有存储的顺序问题。内存中的存储单元是1字节的。

 大端字节序,是指数据的低位字节内容保存在内存的⾼地址处,而数据的高位字节内容,保存在内存的低地址处。

小端字节序,是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。

vs采用的是小端字节序存储

三、练习题

 3.1 如何判断机器的大小端字节序?

 思路一、通过1的二进制来判断,如果位于低地址处的1字节是01,那么是小端字节序,如果位于低地址处的1字节是00.那么是大端字节序。

    int a = 1;
    if (*(char*)&a == 1)
	{
		printf("小端字节序");
	}
	else
	{
		printf("大端字节序");
	}

 图解如下:

 思路一优化:我们可以根据(char*)&a的值进行封装函数,解引用后得到1就是1,得到0就是零,

#include<stdio.h>

int check_sys()
{
	int a = 1;
	return (*(char*)&a);
}

int main()
{
	
	if (check_sys() == 1)
	{
		printf("小端字节序");
	}
	else
	{
		printf("大端字节序");
	}
	return 0;
}

 3.2练习题1

#include <stdio.h>

int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);

	return 0;
}

 答案是:

解析: char类型比较特殊,我们没法单纯通过观察判断char类型到底是signed,还是unsigned,而在vs上,它是被认为成signed char的。 

首先char a 的内部是什么样的呢?如下图所示:

b其实也同理可得,其中存放的是八个1,那c也是如此,只是因为没有了符号位,所以这里的三个变量都存了八个1.

%d是以十进制的形式打印有符号整型,所以会对a进行整型提升,也就是将其补充成四个字节的数据

由于b 和a一样都是signed char类型,所以过程也一样

而c不一样,c由于是无符号整型

因此打印的时候是-1,-1,255

 3.3练习题2

#include <stdio.h>
int main()
{
	char a = -128;
	printf("%u\n", a);
	return 0;
}

%u打印无符号整数 

#include <stdio.h>
int main()
{
	char a = 128;
	printf("%u\n", a);
	return 0;
}

  答案如下:

补充:

char类型的取值范围,char一个字节对应八个比特位,而这八个比特位的取值又如下 所示,所以有符号的char类型取值是-128-127.

所以a当中存储的是

00000000000000000000000010000000----补码

11111111111111111111111110000000----原码

故答案为4294967168

3.4练习题3


#include<stdio.h>

int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
    {
	  a[i] = -1 - i;
	}

	printf("%d", strlen(a));
	return 0;
 }

 根据前面所说,其实signed类型是在兜圈子

 所以这里只要确定0的位置即可,a当中从-1开始存,存够255之后又开始新的轮回

 3.5练习题5

#include<stdio.h>

unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}
                        
	return 0;
 }

结果是死循环 

解析:

无符号char取值是0~255,所以会无限制的打印

3.5练习题4 

#include <stdio.h>

int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
	}

	return 0;
}

解析:

i的数据类型是unsigned int ,是恒大于等于0的,而循环的条件是i>=0,恒成立,所以会不限制的答应i的值。会从9一直开始打印,然后进入2^ 0~2^32-1. 0~4294967295

3.6练习题5 

#include <stdio.h>

int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);

	return 0;
}

结果如下:

解析:

a是数组名,单独放在&后面,取出的是整个数组的地址,+1跳过整个数组的大小,(不理解的可以看http://t.csdnimg.cn/BlJ00)指向末尾,将其存入ptr1, ptr[-1] == *(ptr-1),将其解引用后得到的就是4。

因为数据在vs上看是小端存放,本身转换成int类型后,就是a本身的地址直接加1,然后将其转换成int*类型是四个字节,解引用后,读取要反过来,所以是20 00 00 00

四、浮点数的数据存储

常⻅的浮点数:3.14159、1E10等,浮点数家族包括:  float、double、long double 类型。

看一个例子:

#include <stdio.h>

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;
}

结果如下:

那为什么会这样呢?

这就涉及浮点数的存储了。

假设

V = 5.625 

V = 101 .101 -----二进制

V = 1.011 * 2 ^2

V = (-1) ^ 0 * 1.011 * 2^2 

 其实就是先转换成二进制,然后将二进制小数点向左移动一位的同时E+1,最后将二进制化成大于等于1小于2的数。

 那根据这样的化简,我们有两种存储方式

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

对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

 因为最终M都会化简成1...多少的形式,所以我们只需要在内存中存储有小数点的位置即可。

我们接着看是如何存和取的:

我们存入的时候将其转换成二进制,

所以我们就可以解释第一个练习了:

 9以整型的形式存储在内存中,得到如下二进制序列:

0000 0000 0000 0000 0000 0000 0000 1001

首先,将9的二进制序列按照浮点数的形式拆分,得到第⼀位符号位s=0,后面8位的指数 E=00000000 ,
最后23位的有效数字M=000 0000 0000 0000 0000 1001。
由于指数E全为0,因此,浮点数V就写成:
    V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146) 显然,V是⼀个很小的接近于0的正数,所以用十进制小数表⽰就是0.000000。

浮点数9.0,为什么整数打印是 1091567616
首先,浮点数9.0等于二进制的1001.0,即换算成科学计数法是:1.001×2^3
所以:9.0   =   (−1) ^0 * (1.001)*2^3,
那么,第⼀位的符号位S=0,有效数字M等于001后面再加20个0,凑满23位,指数E等于3+127=130, 即10000010
所以,写成二进制形式,应该是S+E+M,即

0 10000010 001 0000 0000 0000 0000 0000 

这个32位的⼆进制数,被当做整数来解析的时候,就是整数在内存中的补码,原码正是
1091567616

感谢各位同伴的支持,本期数据存储篇就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞关注+收藏,若有不足,欢迎各位在评论区讨论。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GIS之深度学习02:Anaconda2019版本安装(py38)

Anaconda是一个专注于数据科学和机器学习的开源发行版&#xff0c;内置了丰富的工具和库&#xff0c;包括Python解释器、NumPy、SciPy、Pandas、Scikit-learn、TensorFlow等&#xff0c;使用户能够轻松进行科学计算和数据分析。其强大的包管理器conda简化了软件包的安装和环境管…

Linux/Spectra

Enumeration nmap 第一次扫描发现系统对外开放了22&#xff0c;80和3306端口&#xff0c;端口详细信息如下 22端口运行着ssh&#xff0c;80端口还是http&#xff0c;不过不同的是打开了mysql的3306端口 TCP/80 进入首页&#xff0c;点击链接时&#xff0c;提示域名不能解析&…

4核8G服务器并发数多少?性能如何?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

vue3 增加全局水印(显示登录信息)

一、纯文字水印 在main.ts页面里面 加入以下代码&#xff1a; // 导入 Vue 的 createApp 函数 import { createApp } from vue;// 导入全局样式文件 import ./style.css;// 导入根组件 App.vue import App from ./App.vue;// 导入路由配置 import router from ./router;// 使…

VUE从0到1创建项目及基本路由、页面配置

一、创建项目:(前提已经安装好vue和npm) 目录:E:\personal\project_pro\ windows下,win+R 输入cmd进入命令行: cd E:\personal\project_pro E:# 创建名为test的项目 vue create test# 用上下键选择vue2或vue3,回车确认创建本次选择VUE3 创建好项目后,使用…

【CSS-语法】

CSS-语法 ■ CSS简介■ CSS 实例■ CSS id 和 class选择器■ CSS 样式表■ 外部样式表(External style sheet)■ 内部样式表(Internal style sheet)■ 内联样式(Inline style)■ 多重样式 ■ CSS 文本■ CSS 文本颜色■ CSS 文本的对齐方式■ CSS 文本修饰■ CSS 文本转换■ CS…

2024智慧城市革命:人工智能、场景与运营的融合之力

在数字革命的浪潮中&#xff0c;2024年的智慧城市将成为人类社会进步的新地标。 三大关键元素——人工智能、场景应用和精准运营——正在重新塑造城市面貌&#xff0c;构建未来的智慧城市生活图景。 一、人工智能&#xff1a;赋能智慧城市 随着人工智能技术的快速发展&#x…

第十二篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:深度解读SpeechRecognition语音转文本

传奇开心果系列 系列博文目录Python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、SpeechRecognition语音转文本一般的操作步骤和示例代码二、SpeechRecognition 语音转文本的优势和特点三、易用性深度解读和示例代码四、多引擎支持深度解读和示例代码五、灵活性示…

VL817-Q7 USB3.0 HUB芯片 适用于扩展坞 工控机 显示器

VL817-Q7 USB3.1 GEN1 HUB芯片 VL817-Q7 USB3.1 GEN1 HUB芯片 VIA Lab的VL817是一款现代USB 3.1 Gen 1集线器控制器&#xff0c;具有优化的成本结构和完全符合USB标准3.1 Gen 1规范&#xff0c;包括ecn和2017年1月的合规性测试更新。VL817提供双端口和双端口4端口配置&…

Alist访问主页显示空白解决方法

文章目录 问题记录问题探索和解决网络方案问题探究脚本内容查看 最终解决教程 问题记录 访问Alist主页显示空白&#xff0c;按F12打开开发人员工具 ,选择控制台&#xff0c;报错如下 index.75e31196.js:20 Uncaught TypeError: Cannot assign to read only property __symbo…

我来告诉你,为什么你的第一份工作要去大厂

选择第一份工作&#xff0c;就像是为你的职业生涯设置航向&#xff0c;起点往往决定了你能飞得多高。 为什么说走进大厂是一个明智的决策呢&#xff1f; 简单来说&#xff0c;大厂不仅是一个工作的地方&#xff0c;它是一个成长的加速器&#xff0c;一个能让你的能力和视野快速…

2023年清洁纸品行业分析报告:线上市场销额突破124亿,湿厕纸为重点增长类目

如今&#xff0c;清洁纸品早已经成为人们日常生活的必需品&#xff0c;其市场规模也比较庞大。从销售数据来看&#xff0c;尽管2023年清洁纸品市场整体的销售成绩呈现下滑&#xff0c;但其市场体量仍非常大。 鲸参谋数据显示&#xff0c;2023年京东平台上清洁纸品市场的销量将…

【QT+QGIS跨平台编译】之五十三:【QGIS_CORE跨平台编译】—【qgssqlstatementparser.cpp生成】

文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…

分享three.js和cannon.js构建Web 3D场景

使用 three.js&#xff0c;您不再需要花哨的游戏PC或控制台来显示逼真的3D图形。 您甚至不需要下载特殊的应用程序。现在每个人都可以使用智能手机和网络浏览器体验令人惊叹的3D应用程序。 这个惊人的库和充满活力的社区是您在浏览器、笔记本电脑、平板电脑或智能手机上创建游…

Flink SQL 中的流式概念:状态算子

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

认识AJAX

一、什么是Ajax? 有跳转就是同步&#xff0c;无跳转就是异步 Asynchronous Javascript And XML&#xff08;异步JavaScript和XML&#xff09; Ajax 异步 JavaScript 和XML。Ajax是一种用于创建快速动态网页的技术通过在后台与服务器进行少量数据交换&#xff0c;Ajax可以使网…

Python手册(Machine Learning)--LightGBM

Overview LightGBM&#xff08;Light Gradient Boosting Machine&#xff09;是一种高效的 Gradient Boosting 算法&#xff0c; 主要用于解决GBDT在海量数据中遇到的问题&#xff0c;以便更好更快的用于工业实践中。 数据结构说明lightgbm.DatasetLightGBM数据集lightgbm.Bo…

Stable Diffusion WebUI 图库浏览器插件:浏览器以前生成的图片

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文介绍的插件叫图库浏览器&#xff0c;是一个用于浏览器以前生成的图片信息的插件。本文将介绍该插件的安装和使用&#xff0c;希望能够对你有所帮助。 文章…

【JavaEE】_前端POST请求使用json向后端传参

目录 1. 关于json 2. 通过Maven仓库&#xff0c;将Jackson下载导入到项目中 3. 使用Jackson 3.1 关于readValue方法 3.2 关于Request.class类对象 3.3 关于request对象的属性类型 3.4 关于writeValueAsString 前端向后端传递参数通常有三种方法&#xff1a; 第一种&…

UI自动化测试:playwright工具(一):python环境下安装、UI录制使用(需要些代码能力)

一、python环境下安装playwright工具 1. 安装playwright库 pip install playwright -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com#至于镜像源,可以选,也可不选:#阿里云 http://mirrors.aliyun.com/pypi/simple/ #中国科技大学 https://py…