2024.3.16-408学习笔记-C-数据在内存中的存储

news2024/12/25 13:21:49

1、整数型存储

整数型存储就是所有整型家族里的数据类型的存储方式,也就是说包含了字符类型的存储(因为字符的''操作符的返回值是ASCII码值,故实际上存储的是整数)。



1.1、有符号整数

有符号整数包含charshortintlonglong long这几种类型的数据。

他们的二进制表示方法有三种:原码,反码,补码。

这三种表示方法均有符号位数值位两部分,符号位都是用0表示,用1表示,最高位的一位是被当做符号位,剩余的都是数值位。

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

正整数的原、反、补码都相同;负整数的三种表示方法各不相同。

有符号整数在内存中统一以补码的形式存储,并且以补码形式参与任何操作。

以补码形式进行存储的原因:
在计算机系统中,有符号数值一律用补码来表示和存储。

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



1.2、有符号整数的特性

由于补码与数据类型限制精度的特性,产生了一种有意思的循环:
char类型为例子:

-128,-127…-2,-1,0,1,2…126,127,-128,-127…-2,-1,0,1,2…126,127,-128,-127…

总结为:阳极生阴,阴极生阳(有点模运算的感觉在里面)。



1.3、无符号整数

无符号整数包含unsigned charunsigned shortunsigned intunsigned longunsigned long long这几种类型的数据。

无符号数中没有原码-反码-补码的概念。

无符号整数的二进制表示形式只有一种,即直接将无符号整数翻译成对应的二进制形式,并且以这种形式在内存中存储。



1.4、无符号整数的特性

由于数据类型限制精度的特性,也产生了一种有意思的循环:
char类型为例子:

0,1,2…126,127,128…254,255,0,1,2…126,127,128…254,255,0,1,2…126,127,128




2、浮点数型存储

使用浮点数型存储的数据类型有:floatdoublelong double

浮点型数存储也就是IEEE 754标准。



根据IEEE 754标准,任何一个二进制浮点数V可以表示成下面的形式:

V = ( − 1 ) S ∗ M ∗ 2 E V=(-1)^S*M*2^E V=(1)SM2E

其中:

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

M M M:表示有效数字,M取值范围是大于等于1,小于2。

2 E 2^E 2E:表示指数位。

IEEE 754标准的表示规则可总结为:

1、十进制浮点数转换为二进制浮点数。

2、用科学计数法表示此二进制浮点数。

3、表示为IEEE 754格式。



IEEE 754标准的存储规则是:

IEEE 754格式中的 S S S M M M E E E分别提取出来,并且对 M M M E E E进行处理后(对 S S S不做处理),得到:符号码S、尾数码M、阶码E



M M M的处理:
前面说过,1≤ M M M<2,也就是说, M M M可以写成1.XXXXXX的形式,其中XXXXXX表示小数部分。IEEE 754规定,在计算机内部保存 M M M时,默认这个数的第一位总是1,因此 M M M整数位的1需要被舍去,只保存后面的XXXXXX部分,得到尾数码M

比如 M M M1.01的时候,只保存01,等到读取的时候,再把整数位的1补回去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给尾数码M只有23位,将整数位的1舍去以后,等于可以保存24位有效数字。



E E E的处理:

首先,将 E E E转换为二进制数据。

IEEE 754标准规定,处理后得到的阶码E是一个无符号整数(unsigned int)。这意味着,如果阶码E8位,它的取值范围为0~255;如果阶码E11位,它的取值范围为0~2047

但是,我们知道,科学计数法中的 E E E是可以出现负数的,所以IEEE 754规定, E E E必须再加上一个偏移量来变成一个非负数,也就是阶码E。对于8位的 E E E,这个偏移量是127;对于11位的 E E E,这个偏移量是1023

比如, 2 10 2^{10} 210 E E E10,所以在保存为32位浮点数时,必须对 E E E进行处理得到阶码E10+127=137,即10001001

注意:以float类型为例,值为-127128的这2个 E E E有特殊用途,一般不在正常的 E E E讨论范围(-126~127)内,他们的阶码E分别是:
-127-01111111 + 01111111 = 00000000
12810000000 + 01111111 = 11111111



在得到最终的符号码S、尾数码M、阶码E后,按照以下规则将它们连接在一起,得到最终的浮点数型存储的二进制数据:

IEEE754标准规定:

对于32位的浮点数(float类型),最高的1位存储符号码S,接着的8位存储阶码E,剩下的23位存储尾数码M
在这里插入图片描述
对于64位的浮点数(double类型),最高的1位存储符号码S,接着的11位存储阶码E,剩下的52位存储尾数码M在这里插入图片描述
对应例子(十进制浮点数5.5float类型变量进行存储):

1、转换为二进制浮点数: 101.1 101.1 101.1

2、科学计数法表示为: 1.011 ∗ 2 2 1.011*2^2 1.01122

3、IEEE 754格式: V = ( − 1 ) 0 ∗ 1.011 ∗ 2 2 V=(-1)^0*1.011*2^2 V=(1)01.01122

4、经过处理后得到:符号码S0;尾数码M0110000 00000000 00000000;阶码E10000001

5、连接得到最终用于存储的二进制数据:0 10000001 0110000 00000000 00000000

验证:
在这里插入图片描述



3、浮点数型读取过程

从内存中读取浮点数型的二进制数据时,根据阶码E的不同,可以分为三种情况:



3.1、阶码E不全为0也不全为1(通常情况)

此时就直接使用浮点数型存储的逆过程(以float类型为例):

1、将存储的32位二进制数据切割为:1位的符号码S,8位的阶码E,23位的尾数码M

2、将阶码E减去偏移量127,还原为 E E E;将尾数码M补上小数点.和整数位的1,还原为 M M M。(符号码S没有还原过程,直接就是 S S S)。

3、根据IEEE 754格式: V = ( − 1 ) S ∗ M ∗ 2 E V=(-1)^S*M*2^E V=(1)SM2E得到科学计数法的二进制浮点数。

4、最后将二进制浮点数转换为十进制浮点数。



3.2、阶码E全为0

float类型为例:

1、将存储的32位二进制数据切割为:1位的符号码S,8位的阶码E,23位的尾数码M

2、将阶码E减去偏移量127,还原为 E E E,可是由于 E E E-127过于小,能够预测到最终的结果是一个非常小的数字,此时的尾数码在补上小数点.且在整数位补0而不是补1,并且让 E E E+1。这样做的目的是为了表示一个无限接近于±0的数字,也就是: ± 0. x x x x x x x ∗ 2 − 126 \pm0.xxxxxxx*2^{-126} ±0.xxxxxxx2126

3、所以直接规定:阶码E全为0,表示浮点数无限接近于 ± 0 \pm0 ±0。(由于编译器输出浮点数时的精度限制,会输出为0.000000



3.3、阶码E全为1

与以上同理:

阶码E全为1,表示浮点数无限接近于 ± ∞ \pm\infty ±




4、浮点数型存储的精度丢失

浮点数型存储有一个天生的缺点:可能发生精度丢失。

根本原因就是:在数学上,有限的十进制数字的二进制形式可能是无限的。

故而某些浮点数是无法精确保存的。

详见文章:C语言中数据类型的规格与截断、补长

并且衍生出一个浮点数比较的结论:如果两float类型数据的差值小于最小精度位(小数第六位),则这两个数据相等。详见:浮点值的比较




4、大小端字节序存储

我们知道,变量与变量在内存中的存储顺序是由定义顺序与所处内存区域决定(例如在主函数中先后定义ab两个变量,由于这两个变量存放在栈区,故a变量存放于高地址,b变量存放于低地址),这是变量与变量之间的存储顺序。

大小端字节序存储指的是单个变量内部,字节与字节之间的两种存储顺序。

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

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

有大小端模式之分的原因:

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit位,但是在C语言中除了8bitchar之外,还有16bitshort型,32bitlong型(这个要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

例如:一个16bitshort型变量x,在内存中的地址为0x0010x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址0x0010中,0x22放在高地址0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARMDSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

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

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

相关文章

Combining external-latent attention for medical image segmentation

结合外部潜在注意的医学图像分割 摘要 注意机制是提高医学图像分割性能的新切入点。如何合理分配权重是注意力机制的关键,目前流行的方法包括全局压缩和使用自注意操作的非局部信息交互。然而,这些方法过于关注外部特征,缺乏对潜在特征的开发。全局压缩方法通过全局均值或…

(一)基于IDEA的JAVA基础3

通过之前的内容&#xff0c;我们在建好的文件夹下建一个java文件&#xff0c;我们来在IDEA中写一下之前用记事本写的helloworld&#xff0c;我们先看一下java代码的规范: 1.java程序文件名一定要有意义&#xff0c;首字母一定要大写。 2.class后面的名字:由大小写字母&#x…

【NTN 卫星通信】 车辆物联网设备通过NTN和TN切换的应用场景

1 场景描述 对于有两个3GPP无线接入网服务的大面积农田和农场&#xff0c;物联网设备可以通过NTN和TN接入网同时受益于5G系统的双转向数据连接能力。   在这个用例中&#xff0c;我们有一个广域的农业自动化应用系统来控制农业车辆&#xff0c;例如&#xff0c;一个装有数百个…

遇见AI暴雨受邀参加NVIDIA GTC 2024

2024年3月18日&#xff0c;备受瞩目全球科技盛会——2024 GTC在美国加州圣何塞拉开帷幕&#xff0c;此次大会旨在展示最新的GPU&#xff08;图形处理单元&#xff09;技术和应用&#xff0c;以及人工智能、数据科学、深度学习、虚拟化等领域的创新和发展。作为NVIDIA多年的战略…

浅尝大菠萝Pinia

1、pinia简介 Pinia&#xff08;发音为 /piːnjʌ/&#xff0c;类似于英语中的“peenya”&#xff09;是最接近有效包名 pia&#xff08;西班牙语中的_pineapple_&#xff09;的词。 Pinia 是由 Vue.js 团队成员开发&#xff0c;新一代的状态管理器&#xff0c;即 Vuex5.x。 …

C语言-----冒泡排序

今天&#xff0c;让我们来学习一下C语言中一个简单的排序算法------冒泡排序。 什么是冒泡排序呢&#xff1f; 冒泡排序是C语言中一个可以将一个数组的内容按照升序或者降序进行重新排列的算法。简单来说&#xff0c;是一种排序的思维。 冒泡排序的核心思想&#xff1a;让同…

MS2574/2574T/2574S高速、四通道差动线路驱动器

品简述 MS2574/MS2574T/MS2574S 是一款高速、低功耗的四通道 差动线路驱动芯片&#xff0c;用于平衡或非平衡的数字数据传输。可 以满足 ANSI TIA/EIA-422-B 和 ITU &#xff08;原 CCITT &#xff09;建议 V.11 的要求。 三态输出可提供用于驱动双绞线或平行双线传输线路等…

【面试精讲】深克隆和浅克隆的实现方式?深克隆和浅克隆有什么区别?

【面试精讲】深克隆和浅克隆的实现方式&#xff1f;深克隆和浅克隆有什么区别&#xff1f; 目录 本文导读 一、浅克隆&#xff08;Shallow Clone&#xff09; 二、深克隆&#xff08;Deep Clone&#xff09; 1、递归使用clone()方法实现深克隆 2、使用序列化实现深克隆 …

程序员思维之新机遇面前如何选择

你会不会因为 AI 的爆火&#xff0c;焦虑 AI 会替代自己的工作&#xff0c;焦虑其他人躬身入局把你淘汰。 我有过&#xff0c;甚至想全部精力都去学习 ChatGPT、Stable diffusion 、 Midjourney&#xff0c;每新出来一款大语言模型就想预约体验&#xff0c;那段时间像是无头的…

【复现】某指挥调度管理平台 SQL注入漏洞_66

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 该平台提供强大的指挥调度功能&#xff0c;可以实时监控和管理通信网络设备、维护人员和工作任务等。用户可以通过该平台发送指令…

代码随想录算法训练营Day52 ||leetCode 300.最长递增子序列 || 674. 最长连续递增序列 || 718. 最长重复子数组

300.最长递增子序列 class Solution { public:int lengthOfLIS(vector<int>& nums) {if (nums.size() < 1) return nums.size();vector<int> dp(nums.size(), 1);int result 0;for (int i 1; i < nums.size(); i) {for (int j 0; j < i; j) {if (…

概率基础——逻辑回归多分类法

概率基础——逻辑回归多分类法 逻辑回归是一种经典的分类算法&#xff0c;通常用于解决二分类问题。然而&#xff0c;在实际应用中&#xff0c;我们经常会遇到多分类任务。本文将简单介绍逻辑回归的理论、多分类方法以及优缺点&#xff0c;并提供一个Python实现的示例。 逻辑…

2 使用GPU理解并行计算

2.1 简介 本章旨在对并行程序设计的基本概念及其与GPU技术的联系做一个宽泛的介绍。本章主要面向具有串行程序设计经验&#xff0c;但对并行处理概念缺乏了解的读者。我们将用GPU的基本知识来讲解并行程序设计的基本概念。 2.2 传统的串行代码 绝大多数程序员是在串行程序占据…

3.6 条件判断语句cmp,je,ja,jb及adc、sbb指令

汇编语言 1. adc指令 adc是带进位加法指令&#xff0c;它利用了CF位上记录的进位值指令格式&#xff1a;adc 操作对象1&#xff0c;操作对象2功能&#xff1a;操作对象1 操作对象1 操作对象2 CF例如&#xff1a;adc ax,bx&#xff0c;实现的功能是&#xff1a;ax ax bx …

利用JS实现网页全自动翻译

由于谷歌翻译退出内地市场&#xff0c;可能导致谷歌浏览器默认提供的网页全文翻译在内地无法使用。今天我向大家推荐一个简洁的解决方案&#xff1a;只需两行 JavaScript 代码&#xff0c;即可实现 HTML 的全自动翻译&#xff0c;而无需修改页面、配置语言文件或使用 API 密钥。…

eth uniswap 套利交易案例四

交易hash: 0x085843b47c0d1b0f820b80c166ea8dd2e3928876fb353d107e49dcf879cf8426 交易时间&#xff1a; 2024.02.29 获利&#xff1a; 196,284刀 balancer 借了 338个 weth&#xff0c; 然后和 0x3BA6A019eD5541b5F5555d8593080042Cf3ae5f4 交易用 282个weth 换了293个wste…

什么是状态压缩DP???

1. 引言 相信大家已经对普通的01背包或者其他背包问题已经很熟练了&#xff0c;但是有时候我们去解决NP问题&#xff08;指数级别的复杂度&#xff0c;比如N&#xff01;&#xff09;&#xff0c;时间复杂度就会非常之大 所以&#xff0c;这个时候我们需要寻找更加优化的方法…

微信小程序调试、断点调试

1、wxml 查看对应的页面组件 2、console面板可以用来打印信息 3、sources 用来断点调试 4、network面板用来调试接口 5、storage面板 可以查看每个key对应的value内容&#xff0c;这些数据在用户使用小程序时被持久化保存在本地。

Java基础之多线程

多线程 一、多线程的创建1.1 方式一 继承Thread类1.2 方式二 实现Runnable接口1.3 方式二的化简(匿名内部类)1.4 实现Callable接口(JDK5新增)1.5 小节 二、Thread常用API2.1 获取当前线程对象2.2 获取/设置线程名称2.3 Thread的构造器2.4 Thread类的线程休眠方法2.5 小节 三、线…

3 CUDA硬件概述

3.1 PC 架构 首先&#xff0c;我们看看当下许多PC中都使用的酷睿2(Core2)处理器的典型架构&#xff0c;然后分析一下它是如何影响我们使用GPU 加速器的(如图 3-1所示)。 图3-1典型的酷睿2(Core2)系列处理器的结构图 由于所有的 GPU 设备都是通过 PCI-E(Peripheral Communicat…