【c语言进阶】深入挖掘数据在内存中的存储

深入挖掘数据在内存中的存储

  • 数据类型介绍
    • 数据类型基本分类及其大小
  • 整形在内存中的存储方式
    • 原码、反码、补码
    • 大小端介绍
    • 判断一个系统是大端还是小端
  • char与unsigned char值范围与图解
    • 整形存储相关练习题
  • 浮点数在内存中的存储方式
    • 浮点数存储规则
    • 案列
  • 结语

铁汁们,今天给大家分享一篇数组及详解冒泡排序,来吧,开造⛳️

数据类型介绍

类型的意义: 类型是用来创建变量, 变量的创建需要在内存中开辟一块内存空间 ,用来存储变量的值,类型的大小决定了开辟内存空间的大小

数据类型基本分类及其大小

基本内置类型:
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	printf("%d\n", sizeof(int));              //结果为 4
	printf("%d\n", sizeof(short));           //结果为 2
	printf("%d\n", sizeof(char));            //结果为 1
	printf("%d\n", sizeof(long));           //结果为 4
	printf("%d\n", sizeof(long long));     //结果为 8
	printf("%d\n", sizeof(float));        //结果为 4
	printf("%d\n", sizeof(double));      //结果为 8
	return 0;
}

c语言标准只规定sizeof(long)只要大于等于sizeof(int)即可。

在这里插入图片描述
构造类型:
在这里插入图片描述
指针类型:char* p、int* a、float* b等。

空类型:void,用于函数的返回值,函数参数、指针类型。

注意:void* p,空指针既不能进行解引用操作,也不能进行加减整数操作,若想要操作p所指向的值,则需要根据题意,进行强制类型转换。

整形在内存中的存储方式

原码、反码、补码

整形值在计算机内存中有三种不同表示形式:原码、反码、补码。三种表示形式均有一位符号位、其余为均为数值位。

符号位:0表示正数、1表示负数;数值位:原、反、补码均相同。

负整数二进制三种表示方式:

原码:

将数值根据正负数的形式直接翻译成二进制序列就得到原码。

反码:

将原码符号位不变,其他位依次按位取反(二进制数位取反,将0变成1,1变成0)就得到反码。

补码:

反码加一就得到补码。

注意:正整数的原码、反码、补码均相同。
例子:
在这里插入图片描述

注意:用于计算或存放在内存中全为补码,涉及该值打印时为原码(需要把计算的值补码->反码->原码)。

在计算机系统中,数值全部用补码来计算和存储,原因是补码,可以将符号位和数值位统一处理,而cpu中只有加法器,需要将减法转化为加法进行处理。

补码与原码相互转化,其运算过程是相同的:
在这里插入图片描述

大小端介绍

前提:以字节为单位,讨论存储顺序。

大端字节序存储

是指数据的低位存放在内存中高地址处,数据的高位放在内存中低地址处。

小端字节序存储

是指数据的低位存放在内存中低地址处,数据的高位放在内存中高地址处。
在这里插入图片描述

大小端字节序由来:
在计算机内存中,我们是以字节为单位的,每个内存单元大小为一个字节,一个字节对应着8个bit位,但在c语言中除了有8bit的char型,还有16bit位short型,还有32bit位int型,具体为多少要看具体的编译器,不同编译器所规定类型的大小不尽相同,对于位数大于8位的处理器,寄存器宽度大于1个字节,必然存在如何将多字节数排序列的问题,从而引起了大小端的诞生。对于char类型数据无大小端存储模式

判断一个系统是大端还是小端

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 1;
	char* p = (char*)&a;
	printf("%d\n", *p);
	return 0;
}

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

此处博主是用vs2019进行测试的,说明vs编译器是采用小端字节序存储方式进行存储数据。
在这里插入图片描述

char与unsigned char值范围与图解

char为字节,一个单位,8个bit位,有signed char、unsigned char这两种类型。

char、signed char范围:-128~127
在这里插入图片描述
unsiged char范围:0~255
在这里插入图片描述

整形存储相关练习题

扩展知识补充:整形提升

发生整形提升的条件:字节数小于int型,也就是char、short类型在参与计算时会发生整形提升,因为计算机计算时默认为Int型,4个字节,参与运算。

注意一个数发生整形提升时:
a.首先看其自己的类型,若为char、short型,为有符号位,整形提升时看最高位.
b.其次看在打印时,看是以什么格式进行打印,%d是打印有符号位十进制整数(将该数看成有符号数,补码转化为原码在进行打印),%u是打印无符号十进制整数(将该数看成整数,直接转化为十进制进行打印)。

题一、

#define _CRT_SECURE_NO_WARNINGS 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;
}

在这里插入图片描述
图解分析:

在这里插入图片描述
题二、

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

在这里插入图片描述
图解分析:
在这里插入图片描述
题三、

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

在这里插入图片描述
图解分析:
在这里插入图片描述
题四、

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = -20;
	unsigned int j= 10;
	printf("%d\n", i + j);
}

在这里插入图片描述
图解分析:
在这里插入图片描述
题五、

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<Windows.h>
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
		Sleep(1000);
	}
	return 0;
}

在这里插入图片描述
题解分析:因为i的类型为unsigned int型,i为正数,i的值>=0,for循环中的条件判断恒为真。

浮点数在内存中的存储方式

扩展知识:若想要观察整形家族在内存中的值的范围,整数表示的范围,是在#include<limits.h>中定义,浮点数值的范围是在#include<float.h>中定义。

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

浮点数存储规则

根据国际标准IEEE(电气和电子工程协会)754规定,任意一个二进制浮点数科学计数法变现形式为:
在这里插入图片描述
IEEE 754规定:

对于32位的浮点数float型(单精度浮点数),最高1位为符号位S, 接着其后8位为指数E, 剩下的23位为有效数字位M。
对于64位的浮点数double型(双精度浮点数),最高1位为符号位S, 接着其后11位为指数E, 剩下的52位为有效数字位M。

如图所示:
在这里插入图片描述
将浮点数存入内存中,IEEE 754对有效数字M和指数E的规定:

对于M:

由于1<=M<2,M可以写成1.XXXXX形式,其中XXXXX表示小数部分,在计算机内部保存M时,因默认这个数的第一位总是1,因此可以被舍去,只保留XXXXX小数部分。

对于E:

E为一个无符号整数,E为8位时,取值范围为0到255,E为11位时,取值范围为0到2047
但在科学计数法中的E是可以为负数的,所以,IEEE754规定,存入内存时E的真实值必须加上个中间数,对于8位的E,这个中间数为127,对于11位的E,这个中间数为1023(若某个数加上中间数大于E的取值范围,则会越界,但由于IEEE 754的规定,一般不会出现某个数加上中间数大于E的取值范围)。

例子图解:
在这里插入图片描述

将浮点数从内存中取出,IEEE 754对有效数字M和指数E的规定:

对于M:

把第一位的省略的1直接加上去,其后加个小数点,在其后加上存入内存中M部分,在特殊情况下M的取出与E也有关。

对于E:分类讨论

a.E不全为0或不全为1:将存入内存中的E减去127或者1023,就可得到真实值;

b.E全为0:浮点数E等于1-127或者1-1023,即为真实值,此时,有效数字M不在加上第一位的1,而是还原成
0.XXXXX的小数,
这样做的目的是为了表示是0,以及接近1于0的很小数字。(127-127=E->1.XXx*2^-127约等于0)。

c.E全为1(255=127+128,1.01->*2^128趋向正无穷),此处博主不在展开叙述。

案列

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

在这里插入图片描述
解析:

a.以整数的形式放进内存中,在以整数的形式拿出来,结果才会为整形、以浮点数的形式放进内存中,在以浮点数的形式拿出来,结果才会为浮点数。

b.因为小数与整数在内存中的存储方式不同:

以整数的形式放在内存中,将其转化为二进制数,在以浮点数的形式打印,则将该二进制数当作浮点数的二进制数表示形式,在按照浮点数从内存中取出的规则来进行计算。

以浮点数的形式放在内存中,将其转化为浮点数二进制数,在以整数的形式打印,则将该二进制数直接当作整数的二进制数表示形式,按照补码->反码->原码,进行原码的打印。

在这里插入图片描述

结语

铁铁们,深入挖掘数据在内存中存储就到此结束啦,若博主有不好的地方,请指正,欢迎铁铁们留言,请动动你们的手给作者点个👍鼓励吧,你们的鼓励就是我的动力✨

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

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

相关文章

访问修饰符private,default,protected,public访问等级区别

private&#xff1a;private是最严格的访问修饰符&#xff0c;它将成员声明为私有的。私有成员只能在声明它们的类内部访问&#xff0c;其他类无法直接访问私有成员。这样可以确保数据的封装性和安全性。 default&#xff08;默认&#xff09;&#xff1a;如果没有明确指定访问…

Java调用Pytorch实现以图搜图(附源码)

Java调用Pytorch实现以图搜图 设计技术栈&#xff1a; 1、ElasticSearch环境&#xff1b; 2、Python运行环境&#xff08;如果事先没有pytorch模型时&#xff0c;可以用python脚本创建模型&#xff09;&#xff1b; 1、运行效果 2、创建模型&#xff08;有则可以跳过&#xf…

AI实战营:目标检测与MMDetection

目录 目标检测的基本范式 什么是目标检测 目标检测 vs 图像分类 目标检测 in 人脸识别 目标检测 in 智慧城市 ​编辑​编辑 目标检测 in 自动驾驶 目标检测 in 下游视觉任务 目标检测技术的演进 基础知识 框、边界框&#xff08;Bounding Box&#xff09; 交并比…

计算机网络填空题

我会写下自己的答案和理解 希望自己可用在学习中体会到快乐&#xff0c;而不是麻木。 1. 网络协议三要素中语义是指 需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应 1.在计算机网络中要做到有条不紊的交换数据&#xff0c;就必须遵守一些事…

组件更新的底层逻辑

第一种更新&#xff1a;组件更新的逻辑&#xff0c;当修改了相关状态&#xff0c;组件会更新 1.触发shouldComponentUpdate 周期函数:是否允许更新 shouldComponentUpdate(nextProps, nextState) { // nextState: 存储要修改的最新状态 // this. state:存储的还是修改前的状态…

闲置APP小程序开发 你不喜欢的可能正是别人需要的

生活中我们常常会产生各种闲置物品&#xff0c;尤其是对于有宝宝的家庭来说&#xff0c;孩子小的时候可能会添置各种玩具、婴儿车或者是别的用品&#xff0c;随着孩子渐渐长大&#xff0c;这些东西都用不上了&#xff0c;但是扔了又觉得很可惜&#xff0c;留着又占地方&#xf…

RocketMQ5.x版本延迟消息被重放问题调查

一、问题 由于目标计划是将集群从4.9.x逐步升级至5.x&#xff0c;故目前先对一些不重要的集群进行升级测试。 但是在4.x的broker陆续升级至5.x的过程中&#xff0c;发现了延迟消息被重放的问题。 具体如下: 在升级时刷新后台监控&#xff0c;发现竟然有写入量&#xff1a; 即…

基于组件化开发思想的微信小程序开发框架

跨端框架的出现为小程序应用的开发带来了巨大的便利性和灵活性。它们提供了统一的开发方式、代码复用的能力&#xff0c;并且与小程序容器技术紧密结合&#xff0c;实现了一次编码、多端运行的目标。开发者可以根据项目需求和团队技术栈选择合适的跨端框架&#xff0c;从而在不…

11 GMM——高斯混合模型

文章目录 11 GMM——高斯混合模型11.1 模型介绍11.2 通过MLE估计参数11.3 EM求解 11 GMM——高斯混合模型 11.1 模型介绍 从几何角度来说&#xff1a; 高斯混合模型表示&#xff1a;加权平均——由多个高斯分布混合叠加而成&#xff0c;如图 公式可以表达为&#xff1a; p…

基于XC7Z100的PCIe采集卡(GMSL FMC采集卡)

GMSL 图像采集卡 特性 ● PCIe Gen2.0 X8 总线&#xff1b; ● 支持V4L2调用&#xff1b; ● 1路CAN接口&#xff1b; ● 6路/12路 GMSL1/2摄像头输入&#xff0c;最高可达8MP&#xff1b; ● 2路可定义相机同步触发输入/输出&#xff1b; 优势 ● 采用PCIe主卡与FMC子…

安卓大作业 书籍列表APP

系列文章 安卓大作业 书籍列表APP 文章目录 系列文章1&#xff0e;背景2&#xff0e;功能3. 源代码获取 1&#xff0e;背景 我做的项目是一个可以查看到书籍列表以及详情效果的内容&#xff0c;主要使用到的技术有Intent数据传递以及数据库存储的应用&#xff0c;其次使用的组…

Qt线程的几种使用方法

目录 引言使用方法重写QThread::run()moveToThreadQRunnable使用QtConcurrent使用 完整代码 引言 多线程不应该是一个复杂而令人生畏的东西&#xff0c;它应该只是程序员的一个工具&#xff0c;不应该是调用者过多记忆相关概念&#xff0c;而应该是被调用方应该尽可能的简化调…

Linux教程——常见Linux发行版本有哪些?

新手往往会被 Linux 众多的发行版本搞得一头雾水&#xff0c;我们首先来解释一下这个问题。 从技术上来说&#xff0c;李纳斯•托瓦兹开发的 Linux 只是一个内核。内核指的是一个提供设备驱动、文件系统、进程管理、网络通信等功能的系统软件&#xff0c;内核并不是一套完整的…

网络安全从业人员2023年后真的会被AI取代吗?

随着ChatGPT的火爆&#xff0c;很多人开始担心网络安全从业人员会被AI取代。如果说网络安全挖洞的话&#xff0c;AI可能真的能取代。但是网络安全不仅仅只是挖洞&#xff0c;所以AI只是能缓解网络安全人员不足的情况&#xff0c;但是是不会取代人类的作用的。 就拿最近很火的C…

【线性代数】

求解线性方程组 右乘向量/矩阵 把左边的矩阵拆成一个个列向量&#xff0c;右边的向量表示对左边列向量组的线性组合。 [ c o l 1 c o l 2 c o l 3 ] [ 3 4 5 ] [ 3 c o l 1 4 c o l 2 5 c o l 3 ] \left[\begin{array}{c} col_{1} & col_{2} & col_{3} \end{array}\…

WPS表格处理

wps表格中公式出来的内容如何转为纯文本 选中公式算出的结果区域&#xff0c;复制&#xff0c;在原区域上右键&#xff0c;选择性粘贴为数值&#xff0c;就转成文本了&#xff0c;当然公式也就消除了。 wps表格如何设置整列公式&#xff1f; 1、先来看看下面这个例子需做出商…

Git、Github、Gitee的区别

⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Git 目录 1、Git2、Gitee3、GitHub 什么是版本管理&#xff1f;   版本管理是管理各个不同的版本&#xff0c;出了问题可以及时回滚。 1、Git Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理代码的变化。它是…

【Ubuntu系统内核更新与卸载】

【Ubuntu系统内核更新与卸载】 1. 前言2. 内核安装2.1 系统更新2.2 官网下载 3. 内核卸载3.1 需求分析3.2 卸载方法 1. 前言 我们在搭建环境时常常遇到内核版本不匹配的问题&#xff0c;需要我们安装新的内核版本&#xff1b;有时又会遇到在安装软件时报错boot空间已满无法安装…

2021年国赛高教杯数学建模B题乙醇偶合制备C4烯烃解题全过程文档及程序

2021年国赛高教杯数学建模 B题 乙醇偶合制备C4烯烃 原题再现 C4 烯烃广泛应用于化工产品及医药的生产&#xff0c;乙醇是生产制备 C4 烯烃的原料。在制备过程中&#xff0c;催化剂组合&#xff08;即&#xff1a;Co 负载量、Co/SiO2 和 HAP 装料比、乙醇浓度的组合&#xff0…

(六)CSharp-CSharp图解教程版-委托

一、委托概述 1、什么是委托 委托和类一样&#xff0c;是一种用户定义类型&#xff08;即是一种类&#xff0c;所以也是一个引用类型&#xff09;。在它们组成的结构方面区别是&#xff0c;类表示的是数据和方法的集合&#xff0c;而委托则持有一个或多个方法。 可以把 deleg…