整数和浮点数在内存中存储

整数在内存中的存储

整数的2进制表⽰⽅法有三种,即原码、反码和补码。

对于整形来说,数据存放内存中的其实是补码。

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

大小端存储

⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。
⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。


为何存在大小端?

大小端之分主要源于计算机系统中多字节数据的存储顺序问题。在计算机系统中,每个地址单元对应着一个字节,而一个字节为8位。然而,对于位数大于8位的处理器,如16位或32位的处理器,寄存器宽度大于一个字节,因此需要将多个字节进行排列。

#include <stdio.h>int check_sys()
{int i = 1;return (*(char *)&i);
}int main()
{int ret = check_sys();if(ret == 1)
{printf("⼩端\n");
}else
{printf("⼤端\n");
}return 0;
}

联合体:

int check_sys()
{{int i;char c;}un;un.i = 1;return un.c;
}

550ddf8cec4e4e4889c1e5b0a8556cf7.jpeg

 浮点数在内存中的存储

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

在这个程序中,输出为9 0.000000 一个很大的数值 9.000000

任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (-1) ^S*M*2^E 
• (-1)^S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M表⽰有效数字,M是⼤于等于1,⼩于2的
• E 表⽰指数位

02c128691c3b4ae092c477af91065182.png

79ad25f2b37144c3b486efd7e352dade.png 在计算机内部保存M的时候,默认第一位总是1,所以可以舍去,只保留后面的部分。等到读取的时候,再把第⼀位的1加上去。这样做的⽬的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。

E为一个无符号整数,但是科学计数法中的E是可以出现负数的。等到读取的时候,再把第⼀位的1加上去。这样做的⽬的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。

指数E从内存中取出可以再分成三种情况:

E不全为0或不全为1:

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

E全为0:

浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还
原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字。

E全为1:

如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)。
为什么 9 还原成浮点数,就成了 0.000000 ?
9以整型的形式存储在内存中,得到如下⼆进制序列:

1 0000 0000 0000 0000 0000 0000 0000 1001

最后23位的有效数字M=00000000000000000001001。
由于指数E全为0,所以符合E为全0的情况。因此,浮点数V就写成:
   V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146)
显然,V是⼀个很⼩的接近于0的正数,所以⽤⼗进制⼩数表示就是0.000000。

浮点数9.0,为什么整数打印是 1091567616?

⾸先,浮点数9.0等于⼆进制的1001.0,即换算成科学计数法是:1.001×2^3
所以:9.0 = (-1) *(1.001) ∗ 2^3。

那么,第⼀位的符号位S=0,有效数字M等于001后⾯再加20个0,凑满23位,指数E等于3+127=130,即10000010,
所以,写成⼆进制形式,应该是S+E+M,即0 10000010 001 0000 0000 0000 0000 0000

练习

signed char所有的最高位被当作符号位,剩下的为数值位。内存中存放的数据为补码。最前面为1,是负数。符号位不变,其他位置按位取反再+1。

aa4174fee4a44320a3d0f632514c9a11.png

unsigned char 0-255

e9032379440c4ec9a8b649d3dd1352ec.png

 

这三种类型,在内存种存储时的补码是相同的,都是11111111。char类型要提升为int类型才能打印,整形提升的时候要补充符号位111111111111111,打印-1。signed char同理。unsigned0000000011111111,打印256。

 

打印的是无符号数。-128是1000000001000000%u打印认为a中存储的是无符号数,首先要整型提升。其在内存中的补码为1111 1111 1111 1111 1111 1111 111。打印的值是二进制补码所对应的十进制。128放入就不是128了,因为signed int所存储的值是-128~127。只能存8个比特位10000000。高位补1,1111111110000000。unsigned是无符号是但是用%d,又被当作无符号类型。

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

求得的是字符串的长度,并且是\0(asc码值为0)之前的长度。ea6a648aeb0a478787cec5f0fc2f67c8.jpg

 顺序为-1 -2 -3 ……-128 127 126 ……0。一共有255个数字。

 

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

unsigned char只能存到255,取值范围为0-255。永远大于等于0,所以永远成立。

#include <stdio.h>int main()
{int a[4] = { 1, 2, 3, 4 };int *ptr1 = (int *)(&a + 1);int *ptr2 = (int *)((int)a + 1);printf("%x,%x", ptr1[-1], *ptr2);return 0;
}

相当于整型加整型。

4 20000000

 

 

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

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

相关文章

【爬虫】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 爬虫 目录&#xff1a; &#xff08;一&#xff09;web自动化和接口自动化 &#xff08;二&#xff09;实战-爬取Boss直聘信息数据

构建强大的API:Django中的REST框架探究与实践【第146篇—Django】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 构建强大的API&#xff1a;Django中的REST框架探究与实践 在当今的Web开发中&#xff0c;构…

面试算法-83-不同路径 II

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到…

如何一键下载微信视频号的视频至本地电脑

社交媒体平台上的短视频已经成为我们获取信息和娱乐的重要来源&#xff0c;尤其是微信视频号。这个平台汇聚了丰富多样的内容&#xff0c;从生活分享到专业知识&#xff0c;应有尽有。然而&#xff0c;有时我们可能希望将这些有趣的或有用的视频保存到本地以便离线观看或分享给…

单片机学到什么程度才可以去工作?

单片机学到什么程度才可以去工作? 如果没有名校或学位的加持&#xff0c;你还得再努力一把&#xff0c;才能从激烈的竞争中胜出。以下这些技能可以给你加分&#xff0c;你看情况学&#xff0c;不同行业对这些组件会有取舍: . Cortex-M内核:理解MCU内核各部件的工作机制&#…

如何利用RunnerGo简化性能测试流程

在软件开发过程中&#xff0c;测试是一个重要的环节&#xff0c;需要投入大量时间和精力来确保应用程序或网站的质量和稳定性。但是&#xff0c;随着应用程序变得更加复杂和庞大&#xff0c;传统的测试工具在面对比较繁琐的项目时非常费时费力。这时&#xff0c;一些自动化测试…

学习总结2

解题思路 用bfs进行搜索,标记A罐B罐所保存的水的出现情况,当再次出现的时候停止搜索,然后用数组模拟链表进行保存路径.最后输出. 代码 #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #in…

Python学习day3

知识&#xff1a; #继承&#xff0c;创建有继承的类 #父类、子类 #class 子类(父类): #调用时找父类的构造函数&#xff0c;如果子类自己有某函数则调用子类的&#xff0c;否则调用父类的 #在子类有构造函数的时候调用父类&#xff0c;可以用super().__init__的方法调用父类函数…

基于springboot的“漫画之家”系统

目录 背景 技术简介 系统简介 界面浏览 背景 随着科技的不断进步&#xff0c;计算机已经变成了人们日常生活和工作不可或缺的工具。在这样的环境下&#xff0c;互联网技术被广泛运用于各个领域&#xff0c;以提升工作和生活的效率&#xff0c;推动了网络信息技术的迅猛发展…

基于Springboot的西安旅游系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的西安旅游系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

力扣热门算法题 52. N 皇后 II,53. 最大子数组和,54. 螺旋矩阵

52. N 皇后 II&#xff0c;53. 最大子数组和&#xff0c;54. 螺旋矩阵&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.20 可通过leetcode所有测试用例。 目录 52. N 皇后 II 解题思路 完整代码 Python Java 53. 最大子数组…

多线程基础 -概念、创建、等待、分离、终止

文章目录 一、 线程概念1. 什么是线程2. 线程的优点3.线程的缺点4. 线程异常5. 线程用途 二、 Linux进程VS线程1. 进程和线程2. 进程和线程的地址空间3. 进程和线程的关系 三、Linux线程控制1. POSIX线程库2. 线程创建3. 线程ID及进程地址空间布局4. 线程终止5. 线程等待6. 线程…

Linux初识环境变量

&#x1f30e;环境变量【上】 文章目录&#xff1a; 环境变量 什么是环境变量 关于命令行参数 环境变量       简单了解       为什么需要环境变量       系统中其他环境变量 总结 前言&#xff1a; 环境变量是一种非常重要的概念&#xff0c;它们对于系统的…

长安链正式发布三周年,技术更迭支撑产业变革

导语&#xff1a; 2024年1月27日长安链正式发布三周年&#xff0c;开源社区借开年之际与大家一同回顾长安链三年来的技术发展历程&#xff0c;每一个里程碑的建设都得益于与长安链同行的合作伙伴与开发者&#xff0c;希望在2024年可以共同携手继往开来&#xff0c;为数字经济发…

Mysql面试题以及答案

1 基础 1.1、MySQL有哪些数据库类型&#xff1f; 数值类型 有包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT&#xff0c;分别表示 1 字节、2 字节、3 字节、4 字节、8 字节的整数类型。 1&#xff09;任何整数类型都可以加上 UNSIGNED 属性&#xff0c;表示无符号整数。 …

Matlab快捷键与函数

注释&#xff1a;注释对于代码的重要性我们就不做过多的解释了。不做注释的代码不是好代码。选中要注释的语句&#xff0c;按快捷键CtrlR,或者在命令行窗口上面的注释地方可以进行注释。当然也可以直接在语句前面“%”就可以&#xff08;注意&#xff1a;一定要用英文符号&…

第十二届蓝桥杯省赛CC++ 研究生组

十二届省赛题 第十二届蓝桥杯省赛C&C 研究生组-卡片 第十二届蓝桥杯省赛C&C 研究生组-直线 第十二届蓝桥杯省赛C&C 研究生组-货物摆放 第十二届蓝桥杯省赛C&C 研究生组-路径 第十二届蓝桥杯省赛C&C 研究生组-时间显示 第十二届蓝桥杯省赛C&C 研究生组…

石油炼化5G智能制造工厂数字孪生可视化平台,推进行业数字化转型

石油炼化5G智能制造工厂数字孪生可视化平台&#xff0c;推进行业数字化转型。在石油炼化行业&#xff0c;5G智能制造工厂数字孪生可视化平台的出现&#xff0c;为行业的数字化转型注入了新的活力。石油炼化行业作为传统工业的重要领域&#xff0c;面临着资源紧张、环境压力、安…

Matlab 双目相机标定(内置函数)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 相机标定的目的就是要找到从世界坐标转换为图像坐标所用到的投影P矩阵各个系数(即相机的内参与外参)。具体过程如下所述: 1、首先我们需要获取一个已知图形的图像(这里我们使用MATLAB所提供的数据)。 2、找到同…

_nodemon自动重启服务器

文章目录 1.安装模块 nodemon1.1安装方式2.jason文件里面可以存储自定义指令 由于每次修改代码都要重启服务器&#xff0c;所以我们希望有一种方式自动监视代码修改&#xff0c;自动启动服务器nodemon模块解决了这个问题 1.安装模块 nodemon 1.1安装方式 全局安装 npm i node…