筑基七层 —— 数据在内存中的存储?拿来吧你

news/2024/4/24 16:47:03/文章来源:https://blog.csdn.net/qq_63200557/article/details/129190806

目录

零:移步

一.修炼必备

二.问题思考

三.整型在内存中的存储

三.大端字节序和小端字节序

四.浮点数在内存中的存储


零:移步

  CSDN由于我的排版不怎么好看,我的有道云笔记相当的美观,请移步至有道云笔记

一.修炼必备

 1.入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com)

 2.趁手武器:印象笔记/有道云笔记

 3.修炼秘籍:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)

 4.雷劫必备:leetcode 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 

 注:遇到瓶颈怎么办?百度百科_全球领先的中文百科全书 (baidu.com)

二.问题思考

 1.C语言数据的类型?

 2.整数在计算机中二进制的表示形式有几种?正整数和负整数相同的吗?

 3.整数在内存中的存放的是什么?怎么验证是这样存放的?

 4.为什么计算机中存放的是补码?

 5.什么是字节序?

 6.数据的字节序是在内存中怎么存储的?

 7.如何判断一个数据的字节序是大端字节序还是小端字节序?

 8.浮点数在内存中的存储和整数的存储是一样的吗?

 9.浮点数的存储规则

三.整型在内存中的存储

 1.C语言数据的类型?

1)整型:char,short,int,long,long long

2)浮点型:float,double

3)构造类型:struct,union

4)指针类型:int*,char*,double*等

5)空类型:void(常用于函数的返回类型,指针类型,函数的参数)

 2.如何查看整数类型的值范围?

    ——在limits.h头文件中查看

 3.整数在计算机中二进制的表示形式有几种?正整数和负整数相同的吗?

  1)整数在计算机中的表示形式有:原码、反码、补码

  2)正整数的原码、反码、补码均相同

  3)负整数的原码、反码、补码的规则

原码:把整数直接按照二进制进行转化

反码:原码的符号位不变,其他位按位取反

补码:反码 + 1

#include <stdio.h>//原码、反码、补码的转化规则
int main()
{//正整数的原码、反码、补码相同int num1 = 5;//00000000 00000000 00000000 00000101  num1的补码//负整数的原码、反码、补码转化int num2 = -5;//10000000 00000000 00000000 00000101  原码//(原码符号位不变,其他位取反)//11111111 11111111 11111111 11111010  反码//(反码+1)//11111111 11111111 11111111 11111011  补码return 0;
}

 4.如何证明整型在内存中存储的是补码?

    ——使用负数证明

  1)打印出负数的十六进制形式(十六进制是无符号的打印)

#include <stdio.h>//证明整型在内存中存储的是补码
int main()
{int num1 = 1;//00000000 00000000 00000000 00000001   1的补码int num2 = -1;//11111111 11111111 11111111 11111111  -1的补码//注:每四个2进制位可以组成一个十六进制:ffffffprintf("%x\n", num1);//1printf("%x\n", num2);//fffffffreturn 0;
}

  运行结果如图:

  2)调试查看负数在内存中的存储形式 

 5.为什么计算机中存放的是补码? 

1)方便运算:省去了计算机判断符号位或判断+/-运算的麻烦,采用补码后,不管是加法还是减法均是使用加法进行运算(CPU只有加法器)

2)更加标准:保证了系统的编码的一致性和连续性,也同时避免了+/-0的麻烦 

 6.practice

  case 1:思考并分析

#include <stdio.h>int main()
{char a = -1;//默认是有符号数//10000001 原码//11111110 反码//11111111 补码//11111111 11111111 11111111 11111111 整型提升//11111111 截取(补码)//10000001 原码(-1)signed char b = -1;//b 和 a一样unsigned char c = -1;//10000001 原码//11111110 反码//11111111 补码//11111111 11111111 11111111 11111111 整型提升//11111111 截取 --无符号数:255printf("a=%d,b=%d,c=%d\n", a, b, c);//-1 -1,255return 0;
}

  运行结果如图:

  case 2:思考并分析 

#include <stdio.h>int main()
{char a = -128;//10000000 -- 补码//因为是无符号整型打印,需要整型提升//11111111 11111111 11111111 10000000  -- 4294967168(结果)printf("%u\n", a);//4294967168return 0;
}

  运行结果如图:

  case 3:思考并分析

#include <stdio.h>int main()
{char a = 128;//10000000//11111111 11111111 11111111 10000000 整型提升//-- 4294967168(结果)printf("%u\n", a);//4294967168return 0;
}

  运行结果如图:

  case 4:思考并分析 

#include <stdio.h>int main()
{int a = -20;//10000000 00000000 00000000 00010100 原码//11111111 11111111 11111111 11101011 反码//11111111 11111111 11111111 11101100 补码unsigned int b = 10;//11111111 11111111 11111111 11101100 补码(-20)//00000000 00000000 00000000 00001010 补码 (10)//11111111 11111111 11111111 11110110 运算结果(补码)//11111111 11111111 11111111 11110101//10000000 00000000 00000000 00001010  -10:结果printf("%d\n", a + b);return 0;
}

  运行结果如图:

  case 5:思考并分析 

#include <stdio.h>int main()
{unsigned int i;//为什么进行了死循环?//i是无符号整型//i = 0;执行i--的时候//00000000 00000000 00000000 00000000  0的补码//11111111 11111111 11111111 11111111  -1的补码(无符号数,最高位没有正负之分)//4294967295(-1的时候的值)for (i = 9; i >= 0; i--){printf("%u\n", i);}return 0;
}

  运行结果如图:

  case 6:思考并分析 

#include <stdio.h>
#include <string.h>int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;//11111111  -1的补码//11111110  -2的补码//11111101  -3的补码//……//10000000  -128的补码//01111111   127的补码//……//00000000   0的补码('\0')}printf("%d\n", strlen(a));//255return 0;
}

  一图了解char的范围:

  运行结果如图:

  case 7:思考并分析

#include <stdio.h>unsigned char i;
int main()
{for (i = 0; i <= 255; i++){printf("hehe\n");//11111111 i为255的时候//00000000 255+1后的值//所以为死循环}return 0;
}

  运行结果如图:

三.大端字节序和小端字节序

 1.什么是字节序?

    ——字节序又称为端序或尾序,指计算机内存中多字节数据在内存中的排列顺序

 2.数据的字节序是在内存中怎么存储的?

    ——浮点数和整数的字节序都有大端和小端两种字节序

1)小端字节序

        ——数据的低位字节存储在内存的低地址处,高位字节存储在内存的高地址处

2)大端字节序

        ——数据的低位字节存储在内存的高地址处,高位字节存储在内存的低地址处

 3.如何判断一个数据的字节序是大端字节序还是小端字节序?

    ——内存中查看该数据的存储形式,看低位存放在内存中的位置

  图解:

  代码解释:

#include <stdio.h>int main()
{int num = 0x11223344;float data = 5.5;//101.1//01000000101100000000000000000000//40b00000:十六进制形式return 0;
}

  小端字节序在内存中的图解:

  大端字节序在内存中的图解: 

 4.一道笔试题加强巩固

    ——请判断一个机器是大端字节序还是小端字节序

思路分析:我们只需要判断取出1的最低位即可,如果是0,则是大端存储序列,如果是1,则是小端字节序

#include <stdio.h>//判断当前机器是大端还是小端字节序
int main()
{int a = 1;char* p = (char*)&a;if (*p == 1){printf("小端字节序\n");}else{printf("大端字节序\n");}return 0;
}

   代码是写出来了,但是这样写是不是有点太low了,我们换种方式

#include <stdio.h>//判断当前机器是大端还是小端字节序
int judge(int a)
{char* p = (char*)&a;return *p;//如果小端,直接返回1,大端返回0
}int main()
{int a = 1;if (judge(a) == 1){printf("小端字节序\n");}else{printf("大端字节序\n");}return 0;
}

  运行结果如图:

 

四.浮点数在内存中的存储

 1.怎么查看浮点数的值范围?

    ——在float.h头文件中查看

 

 2.浮点数的存储规则

  1)浮点数进行存储的形式:(-1)^S * M * 2^E;

    ——解释:S表示符号位,M表示有效数字:1

  2)在IEEE的规定下,最高位的1位S表示符号位,接下来的八位表示指数E,剩下的23位表示有效数字M

   float图解:

   double图解:

  3)由图知:float的指数位有8位,double的指数位有11位,float的M有23位,double的M有52位

  4)IEEE对M和E还有一些特别的规定

   i.因为1

   ii.指数E是一个无符号整数(unsigned int)

a.float的话,E的值在0~255之间;double的话,E的值在0~2047之间

b.注意,科学计数法中的E是可以是为负数的,所以我们在计算E的时候,应该加上一个中间值,float类型+127,double类型+1023

   iii.E从内存中取出的三种情况

a.E不为全0或全1

        ——使用E转化的十进制值减去127/1023得到真实值,在给有效数字加上小数点前面的1(常用)

b.E全为0

        ——E的值是1-127或1-1023,得到真实值,这个时候我们不需要在加上小数点前面的1了,这样做是为了表示正负0,以及接近0的很小的数值

c.E全为1

        ——这时,如果有效数字全为0,表示±无穷大(正负取决于符号位s)

 3.practice

  case 1:分析解释下面代码 

#include <stdio.h>int main()
{int num = 9;float* p = (float*)&num;printf("%d\n", num);//9printf("%f\n", *p);//0.000000//分析为什么是0.000000//00000000 00000000 00000000 00001001  9的补码//浮点数中看到的形式//0 00000000 00000000000000000001001//相当于0.00000000000000000001001 * (1 - 2^-126)//这个数非常小,而浮点数默认取小数点后6位,所以为0.000000*p = 9.0;//1001.0//1.001 * 2^3//S = 0,E = 2, M = 1.001//可以写出*p的的二进制序列//0 10000010 00100000000000000000000 *p的二进制序列//化为整数:1091567616printf("%d\n", num);//1091567616printf("%f\n", *p);//9.000000return 0;
}

  运行结果如图:

  case 2:分析并解释

#include <stdio.h>int main()
{float num = 5.5;//101.1 --> 1.011//S = 0,E = 2, M = 1.011 --> 得出二进制序列//0 10000001 01100000000000000000000  num的二进制序列int* p = (int*)&num;//01000000101100000000000000000000  结果:1085276160printf("%f\n", num);//5.500000printf("%d\n", *p);//1085276160*p = 5;//01000000 10110000 00000000 00000000序列变为://00000000 00000000 00000000 00000101  5//转化为float类型//0 00000000 00000000000000000000101  //结果:0.00000000000000000000101 * 2 ^ (-126);(极小的数)//转为float即为0.000000printf("%f\n", num);//0.000000printf("%d\n", *p);//5return 0;
}

  运行结果如图:

  !!!恭喜你,突破至筑基七层!!!

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

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

相关文章

驱动程序开发:基于ICM20608六轴传感器 --- 使用Regmap API 的 SPI 读取数据 之 IIO驱动

目录一、IIO 子系统简介二、IIO子系统使用的一些相关的结构体、函数等1、iio_dev 结构体  ①modes&#xff1a;是选择iio驱动设备支持的工作模式&#xff0c;模式分别有如下&#xff1a;  ②dev&#xff1a;其是一个设备结构体。  ②channels&#xff1a;为 IIO 设备通道…

[机器学习]XGBoost---增量学习多阶段任务学习

一 说明当我们的训练数据非常多&#xff0c;并且还在不断增加时&#xff0c;每次都用全量训练&#xff0c;数据过多&#xff0c;时间过长&#xff0c;此时就可以使用增量训练&#xff1a;用新增的数据微调校正模型。二 全量与增量的差异在使用增量训练时&#xff0c;最关心的问…

Head First设计模式---5.单例模式

2.2单例模式 单例模式运用的可能比其他几种简单&#xff0c;通俗点理解就是&#xff0c;我这个对象只能存在一个。 问题 保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例数量&#xff1f; 最常见的原因是控制某些共享资源 &#xff08;例如数据库或文件&am…

【Java】Spring更简单的读取和存储

文章目录Spring更简单的读取和存储对象1. 存储Bean对象1.1 前置工作&#xff1a;配置扫描路径1.2 添加注解存储Bean对象1.2.1 Controller(控制器存储)1.2.2 Service(服务存储)1.2.3 Repository(仓库存储)1.2.4 Component(组件存储)1.2.5 Configuration1.3 为什么要这么多类注解…

结构建模设计——Solidworks软件之装配体操作基本总结三(高级配合、机械配合、快捷菜单功能)

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

如何设计一个通用的权限管理系统

一个系统&#xff0c;如果没有安全控制&#xff0c;是十分危险的&#xff0c;一般安全控制包括身份认证和权限管理。用户访问时&#xff0c;首先需要查看此用户是否是合法用户&#xff0c;然后检查此用户可以对那些资源进行何种操作&#xff0c;最终做到安全访问。身份认证的方…

K8s调度器Scheduler

当创建k8s pod的时候调度器会决定pod在哪个node上被创建且运行&#xff0c;调度器给apiserver发出了一个创建pod的api请求&#xff0c;apiserver首先将pod的基本信息保存在etcd&#xff0c;apiserver又会把这些信息给到每个node上的kubelet进程&#xff0c;kubelet一直在监听这…

【python】anaconda 管理 python 环境

anaconda 管理虚拟环境anaconda 简介python 虚拟环境的安装查看当前 anaconda中所有的虚拟环境创建新的虚拟环境激活所创建的虚拟环境删除指定的虚拟环境退出当前虚拟环境查看当前虚拟环境中所有安装的库安装常用包pycharmpycharm 下环境配置pycharm 使用anaconda 简介 anacon…

springBoot使用ShardingJDBC实现分表

ShardingSphere的介绍 ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞 生&#xff0c;最初就叫ShardingJDBC。2016年的时候&#xff0c;由其中一个主要的开发人员张亮&#xff0c; 带入到京东数科&#xff0c;组件团队继续开发。在国内历经了当当网、…

LeetCode 622.设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里&a…

注意啦!如何通过广告吸引客户直接下单?

2023年跨境电商越来越突出&#xff0c;据业内相关人士称&#xff0c;在未来几年与跨境电商相关的政策仍会继续倾斜甚至加大力度&#xff0c;因此各行各业都响应政策&#xff0c;在新政策落实之前致力于平台的转型升级&#xff0c;做新时代创新型的高质量发展&#xff0c;其实细…

Linux下的命令执行绕过技巧合集(渗透测试专用)

一、通配符* 代表『0个到无穷多个』任意字符&#xff0c;包括空字符? 代表『一定有一个』任意字符[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符&#xff0c; 可能是 a, b, c, d 这四个任何一个』[ - ]若有减号在中括号内时&#…

(考研湖科大教书匠计算机网络)第六章应用层-第五节:文件传送协议FTP

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;概述二&#xff1a;工作原理三&#xff1a;控制连接与数据连接本节对应视频如下 【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】…

求职3个月,简历大多都石沉大海,一听是手工测试都纷纷摇头....太难了

距离被上家公司裁员已经过去了3个月了&#xff0c;3个月的求职经历真的让我痛不欲生&#xff0c;我也从中理解感叹到了很多&#xff0c;想写出来&#xff0c;告诫跟我一样的经历的人。 我今年26岁&#xff0c;大学是一所普通的大专&#xff0c;学的是机电专业&#xff0c;如何…

Python自动化测试框架封装和调用

封装与调用函数与参数化前言 面实现了参数的关联&#xff0c;那种只是记流水账的完成功能&#xff0c;不便于维护&#xff0c;也没什么可读性&#xff0c;接下来这篇可以把每一个动作写成一个函数&#xff0c;这样更方便了。参数化的思维只需记住一点&#xff1a;不要写死 登录…

类与对象(this 关键字、构造器)

目录一、面向对象二、类与对象三、对象内存图四、成员变量和局部变量区别五、this关键字六、构造器/构造方法一、面向对象 一种编程思想:也就是说我们要以何种思路&#xff0c;解决问题&#xff0c;以何种形式组织代码 当解决一个问题的时候&#xff0c;面向对象会把事物抽象成…

分享app的测试技巧

前言 今天笔者想和大家来唠唠app测试&#xff0c;现在的app有非常的多&#xff0c;这些app都是需要经过测试之后才能发布到应用市场中&#xff0c;app已经成为了我们日常生活中不可或缺的一部分了&#xff0c;但它的功能必须强大&#xff0c;才能受到消费者的重视&#xff0c;…

已解决from cryptography.hazmat.backends import default_backend导包错误

已解决Python连接FTPS抛出异常&#xff1a;CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography. The next release of cryptography (40.0) will be the last to support …

pyaudio声卡信息中hostApi是什么意思?

hostApi是声卡驱动协议&#xff0c;声卡驱动模式&#xff0c;有如下很多类。下面的类型是网上找的PortAudio的类&#xff0c;不不确定是不是python的。typedef enum PaHostApiTypeId{paInDevelopment0, /* use while developing support for a new host API */paDirectSound1,p…

深度学习之“制作自定义数据”--torch.utils.data.DataLoader重写构造方法。

深度学习之“制作自定义数据”–torch.utils.data.DataLoader重写构造方法。 前言&#xff1a; ​ 本文讲述重写torch.utils.data.DataLoader类的构造方法&#xff0c;对自定义图片制作类似MNIST数据集格式&#xff08;image, label&#xff09;&#xff0c;用于自己的Pytorc…