【进阶C语言】数据在内存中的存储

news2024/9/24 1:25:59

一、数据类型的介绍

1.整形家族

(1)char--字符型

单位:一个字节,包括unsigned char和signed char

(2)short--短整形

单位:两个字节,包括unsigned short[int]和signed short[int]

(3)int--整形

单位:四个字节,包括unsigned int和signed int

(4)long--长整型

单位:4/8个字节,包括unsigned long和signed long

2.浮点型家族

(1)float--单精度浮点数

单位:四个字节

(2)double--双精度浮点数

单位:八个字节

3.构造类型

(1)数组类型

(2)结构体类型struct

(3)枚举类型enum

(4)联合类型union

4.指针类型

(1)int *pi--整形指针

(2)char *pc--字符型指针

(3)double *pf--双精度指针

(4)void *pv--空类型指针

5.空类型

void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型

二、整形数据在内存中的存储方式

前言:整形在内存中存储的是补码的二进制序列(在初阶C语言的操作符1中有详解介绍原、反、补码)

1.原、反、补码

(1)概念介绍

整数的二进制表示形式有原码、反码和补码三种,对于有符号的数据类型来说,这三种表示方法均可以分为符号位和数值位两部分,第一位数字(最高位)表示符号位,不差于数值大小的表示,正数用0表示,负数则是用1表示。若是无符号数据类型,则没有符号位,每一位都参与数值的表示。

(2)原码

直接将数值按照正负数的形式翻译成二进制就可以得到原码,有多少个比特位就有多少位二进制位。正数的原码、反码和补码都相同;但是负数则需要更具下面的定义去计算。
(3)反码
将原码的符号位不变,其他位依次按位取反就可以得到反码
(4)补码
反码 +1 就得到补码。

2.补码在内存中的存储方法

(1)使用补码存储的意义

官方定义:

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

民间定义:方便转换和计算,如计算1-1的时候

(2)存储顺序

一个内存单元为一个字节,一般数据在内存中的显示形式都是十六进制,四个二进制数字=一个十六进制,八个二进制=一个字节。

代码:

#include<stdio.h>
int main()
{
    unsigned int a=-10;
	int b = -10;
	return 0;
}

a的补码:11111111 11111111 11111111 11110110

b的补码:11111111 11111111 11111111 11110110

数据在内存中的表示图:

分析图:

      为什么在内存中的存储顺序是反着的呢?所以下面的大小端介绍会告诉你答案!

3.大小端介绍(*)

(1)官方定义

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位 , ,保存在内存的高地
址中。

(2)大小端民间定义

我们知道:

     内存也是有顺序的,所以内存也就有高地址和低地址之分。

     数据的每位数字内容也是有大小之分的,如:个位、十位和百位。所以数据也就有了低字节位(最低位,如个位)和高字节位

引出概念: 

大端字节序储存:把一个数据的低字节位数据放在内存的高地址储存,数据的高字节位数据放在内存的低地址位储存。

小端字节序存储:把一个数据的低字节位数据存放在内存的低地址中,数据的高字节位数据存储在内存的高地址处。

      大小端的存储顺序是由编译器决定;而且对一个字节的数据没有作用

(3)简单实例操作

 代码:

#include<stdio.h>
int main()
{
	int a = 0x11223344;//十六进制数字
	return 0;
}

数据在内存中存储:

(4)实战练习

题目:设计程序判断该机器的字节序

代码:

#include<stdio.h>
int main()
{
	int a = 1;
	char* p = (char*) & a;//只能访问一个字节
	if (*p == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

运行结果:

4.数据的存储与打印(*)--char类型

前言:我们已经知道了整形数据是以二进制的补码在内存中存储的,接下来我们更进一步了解他的打印方式(包括有符号和无符号的深度刨析),前面在操作符2中我们已略微了解到了一种方法:整形提升

signed char--8个比特位,所以最大可以存的数字是-128-127

unsigned char--0-256

(1)char类型存储整形范围

 引例:

#include<stdio.h>
int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d\nb=%d\nc=%d\n",a,b,c);
	return 0;
}

运行结果:

为什么同样都是存储-1,结果却大相径庭呢?接下来让我们走入char类型的世界


char类型大介绍:

   首先,char内存占一个字节,一个字节=8个bit,所以就只能存放8个二进制位,所以可以存放的数据大小有范围。

对于signed char(有符号的char):

由此可知,存入char的整形数据的范围是:-128--127。

当然超过这个范围的数据也可以存进去,但是实际的效果还是在:-128--127

对于unsigned char(无符号char):

现在你已经知道了char类型的范围,接下来一起进入实战模拟吧。

(2)实战模拟

(1)实战1 

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

运行结果:

 %d:以十进制的形式,打印有符号的整数

 %u:以十进制的形式,打印无符号的整数

 结果分析:

第一步:分析存入各个变量中的数据

第二步:分析打印的过程

(2)实战2

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

运行结果:

 这个程序不应该执行九次就停止运行了吗,怎么还能得出这么大的数字而且还死循环了。

(3)实战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;
}

运行结果:

strlen是计算字符串长度的,当遇到\0的时候才会停下。结果显示该数组的大小为255

三、浮点型数据在内存中的存储方式

      浮点数其实就是小数,精度越高,小数的位数越高。浮点数也是以二进制的形式存储的,但不是像整形数据一样以补码的形式存储。

1.认识浮点数

(1)浮点数类型分类

float---单精度浮点数

double---双精度浮点数

long double---长精度浮点型

(2)浮点数形式

直接形式:3.14159

科学计数法的形式:1E54==1.0*10^54

2.浮点数转换规则

(1)定义(表示规则)

自我描述:任何一个二进制浮点数V都可以这么表示

表达式:V=(-1)^S*M*2^E

(-1)^S表示符号位,S为次方;当S=0,V为正数;当S=1,V为负数。

M表示有效数字,1<=M<2

2^E表示表示指数位

(2)浮点数的二进制表示

例如:十进制的:10.5;转化成二进制:1010.1

(3)思路分解

十进制:10.5

二进制:1010.1

转换成浮点数表示形式:V=(-1)^S*M*2^E

3.浮点数存储规则

弄清楚了浮点数是怎么转换成二进制的,接下来了解二进制浮点数是怎么存到内存中的。

(1)存储位序

根据公式:V=(-1)^S*M*2^E。我们只需要将S、M和E存入内存中即可(以二进制存入)

规则:

      32位(bit)的浮点数(如:float),最高的一位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。

      64位(bit)的浮点数(如:double),最高的一位是符号位S,接着的11位是指数位E,剩下的52位为有效数字M。

图示:

32位:

64位:

(2)规定

M:因为1<=M<2,所以M可以写成:1.xxxxxx的形式,其中xxxxxx表示小数部分。由于M的第一个数默认为1,所以1可以省略掉,只需要把xxxxxx存入内存中即可,后面不够自动补0。当读数的时候,再把1加回去。

E:E是一个无符号整数,但是E会出现有负数的情况。所以:对于存入内存E的真实值,必须加上一个中间数。对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。

例如:2^10,这个E=10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

4.浮点数取出规则

取出的时候注意两点,第一个就是M的值;重要的是第二个,取出时,指数E有三种情况(因为存进去的时候加了一个中间值),这些都是指在内存中的E。下面逐一介绍。

(1)E不全为0不全为1(常规情况)

这种情况比较简单,直接还原就可以。

规则:指数E的计算值减去127(或1023),得到真实值;再将有效数字M前面加上第一位的1。

(2)E全为0

当存在内存中的E为0时,说明存入前指数E为-127(或-1023),表明此浮点数是一个特别小的数字。

规则:此时的指数E=1-127(或者1-1023),即为真实值。有效数字M不再加上第一位的1,而是直接还原成0.xxxxxxx的小数。

目的:为了表示±0,以及趋于0的很小的数字。

(3)E全为1

当内存中的E为全1的时候,说明原值是一个极大的值,趋于无穷。

这时,如果有效数字M全为0,表示±无穷大,正负取决于S。

5.实例与错误案例

 (1)代码展示

#include<stdio.h>
int main()
{
	int n = 9;
	float* p = (float*)&n;//将n的地址赋予p
	printf("%d\n",n);
	printf("%f\n", *p);
	
	*p = 9.0;//通过指针修改n的值
	printf("%d\n", n);
	printf("%f\n", *p);
	return 0;
}

结果展示:

为什么会有作业的结果呢?这正是由于整数和浮点数的存储方式和取出不一样

(2)结果分析

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

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

相关文章

水果店如何通过小程序商城完成配送路径

水果店线上发展的主要目标就是销售卖货&#xff0c;随着电商经济发展&#xff0c;传统线下店面临不少困境&#xff0c;线上部分商家会选择进驻到电商平台及外卖平台&#xff0c;但收获流量的同时也有高昂的流量费、抽成等成本的支出&#xff0c;难以外部宣传及内部打通流程、较…

电脑工具远程定时任务关机开机

使用方法 定时跟远程是两回事情不要搞混了 定时 不需要 扫码登录 直接就可以 软件设置 时间 到规定时间 就自动关机 远程操作 关机 锁屏 只要扫码登录软件挂后台就可以远程操作了 用自己手机微信扫码登录 后发送&#xff08;口令&#xff09;到文件传输助手 就可以看到口令…

电子技术基础(三)__第1章电路分析基础_第13篇__正弦交流电的相量表示

本文讲解 正弦交流电的稳态分析————正弦量的相量表示 一 基本概念 接下来&#xff0c; 注意: 大写字母 上 加点 表示相量 例如&#xff1a; 因为这里有 I m I_{m} Im​ 是幅值&#xff0c; 所以此相量称为幅值相量。 相量 其实就是一个复数&#xff0c; 表示正弦量的复…

小鹏:交出最差的财报,展现最膨胀的信心

上市三年&#xff0c;小鹏在今年第二季度交出了几乎是史上最差的财报&#xff0c;多项惨烈的数据叠加在一起&#xff0c;远远望去&#xff0c;就像一张病危通知单。 自2020年上市后&#xff0c;小鹏的扩张速度令资本惊叹&#xff0c;截至2023年6月30日&#xff0c;小鹏的门店数…

IntelliJ IDEA使用_Debug操作

文章目录 版本说明图标和快捷键查看变量计算表达式条件断点多线程调试 版本说明 当前的IntelliJ IDEA 的版本是2021.2.2&#xff08;下载IntelliJ IDEA&#xff09; ps&#xff1a;不同版本一些图标和设置位置可能会存在差异&#xff0c;但应该大部分都差不多。 图标和快捷键…

APP自动化之weditor工具

由于最近事情颇多&#xff0c;许久未更新文章。大家在做APP自动化测试过程中&#xff0c;可能使用的是Appium官方提供的inspect进行元素定位&#xff0c;但此工具调试不方便&#xff0c;于是今天给大家分享一款更好用的APP定位元素工具&#xff1a;weditor weditor基于web网页…

前端请求接口地址反向代理后 状态码404、反向代理注意事项

目录 1. 反向代理代码&#xff08;有问题&#xff09;问题 2. 问题排查原因【排查步骤】【问题1】产生原因【问题2】产生原因【附&#xff1a;排查代码】 3. 总结 - 解决代码4. 总结 - 反向代理 1. 反向代理代码&#xff08;有问题&#xff09; 接口封装 export function Get…

JenniAI:基于AI的文章生成器写作助手

【产品介绍】 • 名称 JenniAI • 成立/上线时间 2022年 • 具体描述 Jenni AI是一个基于AI的文章写作助手&#xff0c;通过使用先进的人工智能技术帮助用户更快、更好、更有创意地写作。无论用户需要写一篇论文、一篇博客、一封邮件、…

68、Spring Data JPA 的 方法名关键字查询

★ 方法名关键字查询&#xff08;全自动&#xff09; &#xff08;1&#xff09;继承 CrudRepository 接口 的 DAO 组件可按特定规则来定义查询方法&#xff0c;只要这些查询方法的 方法名 遵守特定的规则&#xff0c;Spring Data 将会自动为这些方法生成 查询语句、提供 方法…

Echarts 折线图的详细配置过程

文章目录 折线图 简介配置步骤简易示例 折线图 简介 Echarts是一款基于JavaScript的开源可视化库&#xff0c;由百度开发和维护。它提供了丰富多样的图表类型&#xff0c;其中折线图是其中一种常用的图表类型。 折线图通过连接数据点所形成的折线来展示数据的变化趋势。在折线…

华为云云耀云服务器L实例评测 | 购买流程及使用教程

目录 前言服务器购买进入购买界面选择服务器配置进行支付购买流程体验 控制台界面进入控制台控制台界面设置初始密码安全组配置 服务器使用使用xshell连接安装常用包实际测试 总结 前言 一直在考虑购买何种服务器&#xff0c;像我正在读研究生&#xff0c;如果想要在linux部署…

设计模式之代理模式的懂静态代理和动态代理

目录 1 概述1.1 如何实现&#xff1f;1.2 优点1.3 缺点1.4 适用场景 2 静态代理实现3 JDK 动态代理实现4 CGlib 动态代理实现5 总结 1 概述 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它的概念很简单&#xff0c;它通过创建一个代理对象来…

便捷又炸街!Mate 60的智感支付,是如何做到快速又安全的?

扫码支付已成为线下消费的主流付款方式&#xff0c;平时出门&#xff0c;手机一带&#xff0c;钱包拜拜&#xff01; 以微信支付为例&#xff0c;正常线下支付&#xff0c;手机解锁状态下&#xff1a; 第一步&#xff1a;找到微信APP&#xff1b; 第二步&#xff1a;打开右上…

9月15日作业

Qt代码 #include "mywnd.h"//构造函数的定义 mywnd::mywnd(QWidget *parent): QWidget(parent) //显性调用父类的有参构造完成对子类从父类继承下来成员的初始化工作 {//窗口设置this->resize(QSize(500, 433));this->setWindowTitle("Widget&quo…

MySQL-Linux安装、卸载:

MySQL8.0.26-Linux版安装 1. 准备一台Linux服务器 云服务器或者虚拟机都可以; Linux的版本为 CentOS7; 2. 下载Linux版MySQL安装包 https://downloads.mysql.com/archives/community/ 3. 创建目录&#xff0c;上传MySQL安装包 /usr/local/src/MySql/ 4. 解压 # 进入到…

软件测试面试必备,一文带你彻底掌握接口测试

一、什么是接口测试&#xff1f; 所谓接口&#xff0c;是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据库的对接。而接口测试&#xff0c;则是通过接口的不同情况下的输入&#xff0c;去对比输出&#xff0c;看看是否满足接口规范所规定的功能、…

Python vs C#:首先学习哪种编程语言最好?

进入编码可能很困难。 最艰难的部分? 决定先学什么语言。 当谈到 Python 与 C# 时,可能很难知道在您的决定中要考虑哪些因素。 我们为您提供了有关这些全明星编程语言的所有信息。 什么是 C#? 自 2000 年作为 Microsoft Visual Studio 的一部分开发 C# 以来,它一直是开发人…

【CSS】画个三角形或圆形或环

首先通过调整边框&#xff0c;我们可以发现一些端倪 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style>.box{width: 150px;height:150px;border: 50px solid black;}</style&g…

Python编程语言学习笔记

目录 1 书写格式1.1 程序框架格式1.1 注释1.2 保留字 2 数据2.1 整数类型2.2 浮点类型2.3 复数类型2.4 数值运算符2.5 数值运函数2.6 数值类型转换函数2.7 math 库2.8 字符串2.8.1 字符串的表示2.8.2 字符串的区间访问2.8.3 字符串操作符2.8.4 字符串操作函数 2.9 字符串类型的…

[杂谈]-二进制到十进制转换

二进制到十进制转换 文章目录 二进制到十进制转换1、概述2、十进制计数系统3、二进制计数系统4、二进制到十进制转换示例5、十进制到二进制转换6、二进制数的名称和前缀7、总结 1、概述 二进制数在数字系统和计算机中用于计算数据。 此外&#xff0c;数字系统之间的数据传输或…