【C进阶】数据的存储

news2025/7/10 12:34:55

文章目录

  • :star:1. 数据类型
  • :star:2. 整形在内存中的存储
    • 2.1 存储规则
    • 2.2 存储模式
    • 2.3 验证大小端模式
  • :star:3. 数据范围
    • 3.1 整形溢出
    • 3.2 数据范围的求解
    • 3.3 练习
  • :star:4. 浮点型在内存中的存储
    • 4.1 浮点数的存储规则
    • 4.2 练习
  • 5. :star::star:总结(思维导图)

⭐️1. 数据类型

在了解数据的是如何存储之前,我们需要先知道C语言有哪些数据类型

😄希望你能看到最后,相信你一定会有收获😄

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

内置类型分为两大类
整形
char
unsigned char
signed char
short
unsigned short [int]
signed short [int]
int
unsigned int
signed int
long
unsigned long [int]
signed long [int]
浮点型
float
double
long double

构造类型
数组类型
结构体类型struct
枚举类型enum
联合类型union

指针类型
内置类型指针
构造类型指针

空类型
void,空类型不能用来定义变量,通常用来表示函数参数个返回值类型

类型的意义
1.决定了编译器给该类型变量分配的存储空间有多大
2.决定了看待该类型变量中数据的视角

⭐️2. 整形在内存中的存储

2.1 存储规则

整形在内存中的存储均是以补码的形式存在,关于补码的相关概念点我

整形-1在内存中存放的二进制就应该是11111111111111111111111111111111
在这里插入图片描述
内存中的数据以16进制显示,转换成2进制的确是32个1

2.2 存储模式

对于字节数大于1的类型,必然存在着数据在该类型中存放顺序的问题,
数据的存放顺序称为存储模式
数据的存储模式有大端字节序存储小端字节序存储两种模式
存储模式和硬件有关,与编译器无关

  • 大端序(Big-Endian)将数据的低位字节存放在内存的高位地址,高位字节存放在低位地址。这种排列方式与数据用字节表示时的书写顺序一致,符合人类的阅读习惯。
  • 小端序(Little-Endian),将一个多位数的低位放在较小的地址处,高位放在较大的地址处,则称小端序。小端序与人类的阅读习惯相反,但更符合计算机读取内存的方式,因为CPU读取内存中的数据时,是从低地址向高地址方向进行读取的。
    在这里插入图片描述

在我的电脑上是小端存储在这里插入图片描述

2.3 验证大小端模式

想要知道是大端字节序还是小端字节序,我们只需要取一个大于1字节数据类型的数据的低地址位置的数据,观察这个数据是该数字的高位还是低位

int Check_System()
{
	int a = 1;				//0x00000001
	char* p = (char*)&a;	//只需要取出一个字节的内容,定义char*
	return *p;				//*p等于1说明低地址的字节为a的地位,为小端存储
}
int main()
{

	int ret = Check_System();
	if (ret == 1)
	{
		printf("小端存储\n");
	}
	else printf("大端存储\n");
}

⭐️3. 数据范围

3.1 整形溢出

每一个整形都有它能表示的最值,当该类型的变量所存储的数据超过了能表示的最值MAX,MIN,存储的数据会转变成另外一个数据,而这个数据一定在该整形所能表示的范围中,这叫做整形溢出

  • 当存储的数据DATA大于该类型MAX,该数据会转换成MIN+(DATA-MAX-1)
    1.在这里插入图片描述
    具体转换过程
    在这里插入图片描述
    2.在这里插入图片描述
    具体转换过程
    在这里插入图片描述

  • 当存储的数据DATA小于该类型MIN,该数据会转换成MAX-(MIN-DATA-1)
    3.在这里插入图片描述
    具体过程
    在这里插入图片描述
    4.在这里插入图片描述
    具体过程
    在这里插入图片描述

3.2 数据范围的求解

知道了当存储的数据超过了该变量类型所能表达的最值后,我们不得不思考,每个类型的最值怎么求?

首先可以参考头文件

#include <limits.h>	//整形类型所能表示的最大小值
#include <float.h>	//浮点型类型所能表示的精度及其范围

在这里插入图片描述
在这里插入图片描述

其次,知道这些范围是怎么来的可以帮助我们更好的理解数据的存储

signed char举例
在这里插入图片描述
signed char补码从8个0到8个1一共有2^8次方中情况,我们为了将每一种二进制序列表示成一个数,就将10000000规定为MIN
我们知道10000001-127的补码,所以我们也可以通过拿-127的补码减一得到-128的补码10000000

3.3 练习

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

//4.
#include <stdio.h>
int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
	//按照补码的形式进行运算,最后格式化成为有符号整数
}

在这里插入图片描述

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

在这里插入图片描述

6.
int main()
{
    char a[1000];
    int i;
    for(i=0; i<1000; i++)
   {
        a[i] = -1-i;
   }
    printf("%d",strlen(a));
    return 0; }

在这里插入图片描述

7.
#include <stdio.h>
unsigned char i = 0;
int main()
{
    for(i = 0;i<=255;i++)
   {
        printf("hello world\n");
   }
    return 0;
    }

在这里插入图片描述

⭐️4. 浮点型在内存中的存储

我们先观察一下浮点数5.0在内存中是如何存储的
在这里插入图片描述

2进制表示就是01000000101000000000000000000000
这和5的补码不一样
因此引出一个概念,浮点数的存储规则是什么?

4.1 浮点数的存储规则

根据IEEE(电气电子工程师学会)754标准,一个任意的二进制浮点数V可以表示成下面这种形式

  • -1)^S * m * 2^e
  • (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
  • m表示有效数字,大于等于1,小于2。
  • 2^e表示指数位。

规定32位的浮点数最高位是符号位S,接着的8位是阶码E,最后的23位是尾数M
在这里插入图片描述

规定64位的浮点数最高位是符号位S,接着的11位是阶码E,最后的52位是尾数M
在这里插入图片描述

对于存储浮点数特别规定:
1.因为有效数字m为1.xxxx,所以规定存储时的尾数M是有效数字去掉1后的二进制序列
2.因为指数位e可能为负数,所以规定存储时的阶码E是指数位e-偏移量,对于32位浮点数来说,偏移量是127,对于64位浮点数来说偏移量是1023

对于取出浮点数时特别规定:
1.阶码全为0或1

因为存储浮点数时将有效数字的1去掉了,所以正常情况下取出浮点数的有效数字时需要将去掉的1补回来,取出浮点数的指数位时需要将内存存储的阶码减去偏移量
前面所说的正常情况是值E不为全0或全1
2.阶码E为全0
取出来时阶码E还原成真实指数值e需要在阶码的基础上减去偏移量,如果阶码E全为0,那么指数值为1-127或者1-1023,规定有效数字m不在加上第一位的1,而还原成0.xxxxx
这样做是为了更好的表示±0以及接近于0很小的数字
3.阶码E全为1
阶码全为1,真实指数值就是阶码的值加上偏移量,最后的还原出来的小数就是±无穷大
注:若float型的小数的二进制中指数小于-127,及加上偏移量后阶码仍然为0,这样的小数精度超过了float型的精度,需要用double存储来表示

浮点数5.0f的二进制是101.0
1*2^0+0*2^1+1*2^2+0^2(-1)
5.0f就可以写成(-1)0 x 1.01 x 22
根据IEEE754规则5.0f的二进制序列就是
0 1000001 01000000000000000000000
在这里插入图片描述

4.2 练习

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

在这里插入图片描述

2.int main()
{
	float a = 7.5f;
	printf("%d\n", a);
	int b = 2;
	printf("%f\n", 2);
	return 0;
}

在这里插入图片描述

特别注意:当char、short、不足int数据进行压栈时,会自动转换为4个字节,float进行压栈时自动转换为double类型,这就是为什么%d可以打印char、short类型的数据而不会影响到后面的参数。看起来%hd和%c是读取两字节和一字节的数,但事实上%hd是在4字节中读取两字节,舍去4字节剩下的部分接着往下读。同理,%c则是在4字节中读取一字节,舍去往下读。这才是为什么short型和char型既可以用%d读,也可以用%hd和%c读的原因。

3.int main()
{
	long long a = 0x0000004400000033;
	printf("%c %c\n", a);
	return 0;
}

在这里插入图片描述

4.int main()
{
	float a = 7.5f;
	printf("%lld\n", a);
	return 0;
}

在这里插入图片描述

5. ⭐️⭐️总结(思维导图)

在这里插入图片描述

最近开学了,没什么时间用来整理博客了,真的是百忙之中抽时间来写博客 😡,后面更新的速度可能会慢点,也有可能开始更行高数、线性代数,毕竟确实是整理在博客上面才会记忆犹新啊😆,看到最后,希望能动动小指头三连😘😘😘

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

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

相关文章

独立产品灵感周刊 DecoHack #048 - 优秀独立开发产品推荐

如果有关注我的 Twitter 的朋友应该看到了&#xff0c;我上周末研究了两天 AI 画图&#xff0c;现在用 Ai 做图太强了&#xff0c;上周又升级 Stable Diffusion 玩了一下&#xff0c;和我去年试的时候相比强大了好多&#xff0c;而且插件LoRA模型玩法都还在快速迭代&#xff0c…

超详细解读!数据库表分区技术全攻略

更多内容可以关注微信公众号&#xff1a;老程序员刘飞 分区的定义 分区是一种数据库优化技术&#xff0c;它可以将大表按照一定的规则分成多个小表&#xff0c;从而提高查询和维护的效率。在分区的过程中&#xff0c;数据库会将数据按照分区规则分配到不同的分区中&#xff0…

【Linux】调试工具gdb的使用

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;前言在前文&#xff0c;我们已经讲解了vim工具以及gcc/g的使用&#xff0c;我们可以进行编写代码以及编译代码了&#xff0c;但是还没有学习如何在Linu…

贪心--跳跃问题/拼接问题

跳跃问题 判断能否从数轴的最左端跳跃到最右边 变形&#xff1a;最少跳跃次数 45.跳跃游戏 题目链接 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示…

博客界的至高神:属于自己的WordPress网站,你值得拥有!

【如果暂时没时间安装&#xff0c;可以直接跳转到最后先看展示效果】 很多朋友都想有一个对外展示的窗口&#xff0c;在那里放一些个人的作品或者其他想对外分享的东西。大部分人选择了在微博、公众号等平台&#xff0c;毕竟这些平台流量大&#xff0c;我们可以很轻易地把自己…

Jectpack -- Navigation了解与简单使用

简介 Navigation是一个可简化的Android导航的库和插件&#xff0c;换句话说&#xff0c;Navigation是用来规范管理Fragment的切换的&#xff0c;并且是通过可视化的方式来进行管理的。 ![[Pasted image 20230210083913.png]] 正常的跳转方法(其实有kotlin以后&#xff0c;代…

【性能测试基础】,从0到实战(手把手教,非常实用)

一、性能基础什么是性能测试--->本质?基于协议来模拟用户发送的请求&#xff08;业务模拟&#xff09;&#xff0c;对服务器形成一定负载。关注点&#xff1a;时间性能、空间性能与界面无关性能测试分类性能测试&#xff08;狭义&#xff09;性能测试方法是通过模拟生产环境…

【C++】多线程

多任务处理有两种形式&#xff0c;即&#xff1a;多进程和多线程。 基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行 文章目录1. 多线程介绍2. Windows多线程1. 多线程介绍 每一个进程&#xff08;可执行程序&#xff09;都有一个主线…

AcWing1027. 方格取数

AcWing1027. 方格取数设有 NN 的方格图&#xff0c;我们在其中的某些方格中填入正整数&#xff0c;而其它的方格中则放入数字0。如下图所示&#xff1a;某人从图中的左上角 A 出发&#xff0c;可以向下行走&#xff0c;也可以向右行走&#xff0c;直到到达右下角的 B 点。在走过…

SpringBoot+Vue前后端分离管理系统02:前端

前端环境搭建 1、node环境 C:\Windows\system32>node -v v12.13.0C:\Windows\system32>npm -v 6.12.0 2、下载vue-admin-template 官网&#xff1a;介绍 | vue-element-admin 项目初始化 1、安装依赖 在刚才下载的vue-admin-template-4.4.0目录下以管理员方式运行c…

Robot Framework + Selenium2Library环境下,结合Selenium Grid实施分布式自动化测试

最近一段时间&#xff0c;公司在推行自动化测试流程&#xff0c;本人有幸参与了自定义通用控件的关键字封装和脚本辅助编写、数据驱动管理、测试用例执行管理等一系列工具软件的研发工作&#xff0c;积累了一些经验&#xff0c;在此与大家做一下分享&#xff0c;也算是做一个总…

SQL零基础入门学习(四)

SQL零基础入门学习&#xff08;三&#xff09; SQL INSERT INTO 语句 INSERT INTO 语句用于向表中插入新记录。 SQL INSERT INTO 语法 INSERT INTO 语句可以有两种编写形式。 第一种形式无需指定要插入数据的列名&#xff0c;只需提供被插入的值即可&#xff1a; INSERT …

ImageCombiner设计源码详解

前言在前面的博客中介绍了一款Java的海报生成器ImageCombiner,原文地址&#xff1a;拿来就用的Java海报生成器ImageCombiner&#xff08;一&#xff09;&#xff0c;在博文中简单介绍了一下代码以及一个真实的生成案例。但是对源码的介绍不多&#xff0c;本文就针对源码进行深入…

vs2022 x64 C/C++和汇编混编

vs2022环境x64 C/C和汇编混编vs64位程序不支持__asm内嵌汇编&#xff0c;需要单独编写汇编源文件示例如下1、新建空的win32项目&#xff0c;新建main.cpp&#xff0c;示例代码如下2、新建asm64.asm汇编源文件&#xff0c;示例代码如下3、编译器配置&#xff0c;选择x64&#xf…

【编程入门】应用市场(uni-app版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目&#xff0c;使…

华为OD机试 - 最短木板长度(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

PowerJob容器的前世,容器是如何产生,如何上传到Server上去的

这不仅仅是一篇PowerJob源码分析的文章&#xff0c;还有很多的java基础知识&#xff0c;在实践中学习效果更好&#xff0c;感兴趣就留下来交流一下吧。 power容器虽然说是容器&#xff0c;但并不是docker容器&#xff0c;仅仅就是java的jar包 &#xff0c;可以通过框架下载一套…

手工测试混了5年,年底接到了被裁员的消息....

大家都比较看好软件测试行业&#xff0c;只是因为表面上看起来&#xff1a;钱多事少加班少。其实这个都是针对个人运气好的童人才会有此待遇。在不同的阶段做好不同阶段的事情&#xff0c;才有可能离这个目标更近&#xff0c;作为一枚软件测试人员&#xff0c;也许下面才是我们…

阿里5年,一个女工对软件测试的理解

成为一个优秀的测试工程师需要具备哪些知识和经验&#xff1f; 针对这个问题&#xff0c;可以直接拆分以下三个小问题来详细说明&#xff1a; 1、优秀软件测试工程师的标准是什么&#xff1f; 2、一个合格的测试工程师需要具备哪些专业知识&#xff1f; 3、一个合格的测试工程…

介绍Kadence Elements元素模板:按您的方式设计网站

随着 Kadence Pro 1.0.4 和 Kadence Blocks Pro 1.5.8 的发布&#xff0c;Kadence 团队很高兴地宣布推出最强大的新方法&#xff0c;帮助网站所有者使用 Kadence Elements Templates 创建动态和高度定制的 WordPress 网站。如果您曾经创建过 WordPress 网站&#xff0c;并且发现…