玩转C语言——C语言中内存存储

一、 整数在内存中的存储

        我们知道:整数的2进制表⽰⽅法有三种,即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最 ⾼位的⼀位是被当做符号位,剩余的都是数值位。

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

         原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

        反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

         补码:反码+1就得到补码。

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

二、⼤⼩端字节序和字节序判断

        我们复习了以上知识后,我们来看内存存储的一个细节:

#include<stdio.h>
int main()
{int n = 0x11223344;return 0;
}

        调试的时候,我们可以看到在n中的 0x11223344 这个数字是按照字节为单位,倒着存储的。 这是为什么呢?这个时候不得不引出两个概念:大端存储和小段存储。

        2.1 大、小端存储

        其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分 为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:

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

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

        上述概念需要记住,⽅便分辨⼤⼩端。

        2.2 为什么会有大小端

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

        2.3 练习

        请简述⼤端字节序和⼩端字节序的概念,设计⼀个⼩程序来判断当前机器的字节序。(10分)-百度笔 试题

        以下代码仅供参考。

#include<stdio.h>
int main()
{char n = 1;if (*((char *)&n) == 1){printf("小端");}elseprintf("大端");return 0;
}

        再来一题吧:

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

        大家可以猜测一下输出结果是什么?

        这是为什么呢?前两个没有什么好说的,最后一个是无符号整数,在计算机中储存的都是补码,这下你应该能明白了吧。

 三、浮点数在内存中的存储 

        3.1 浮点数的存储

        根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:

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

         (−1)S 表⽰符号位,当S=0,V为正数;当S=1,V为负数

        M 表⽰有效数字,M是⼤于等于1,⼩于2的

        2^ E 表⽰指数位

        ⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2 。 那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。 ⼗进制的-5.0,写成⼆进制是 -101.0 ,相当于 -1.01×2^2 。那么,S=1,M=1.01,E=2。

         IEEE 754规定:

        对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M

        对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M 

                 3.2 浮点数存的过程

        IEEE 754 对有效数字M和指数E,还有⼀些特别规定。

         前⾯说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表⽰⼩数部分。 IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的 xxxxxx部分。⽐如保存1.01的时候,只保存01,等到读取的时候,再把第⼀位的1加上去。这样做的⽬ 的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保 存24位有效数字。

         ⾄于指数E,情况就⽐较复杂

        ⾸先,E为⼀个⽆符号整数(unsigned int)

         这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我 们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。⽐如,2^10的E是 10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

        3.3 浮点数取的过程

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

        1. E不全为0或不全为1

         这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效 数字M前加上第⼀位的1。 ⽐如:0.5 的⼆进制形式为0.1,由于规定正数部分必须为1,即将⼩数点右移1位,则为1.0*2^(-1),其 阶码为-1+127(中间值)=126,表⽰为01111110,⽽尾数1.0去掉整数部分为0,补⻬0到23位.

       2. E全为0

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

        3.E全为1

        这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s);

        完!

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

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

相关文章

【Java】使用 Java 语言实现一个冒泡排序

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章。 这是《Java》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识…

【动态三维重建】Deformable 3D Gaussians 可变形3D GS用于单目动态场景重建(CVPR 2024)

主页&#xff1a;https://ingra14m.github.io/Deformable-Gaussians/ 代码&#xff1a;https://github.com/ingra14m/Deformable-3D-Gaussians 论文&#xff1a;https://arxiv.org/abs/2309.13101 文章目录 摘要一、前言二、相关工作2.1 动态场景的神经渲染2.2 神经渲染加速 三…

【Web应用技术基础】HTML(3)——表格

目录 题目1&#xff1a;原始表格 题目2&#xff1a;width、height 题目3&#xff1a; cellpadding 题目4&#xff1a;cellspacing、cellpadding 题目5&#xff1a;caption 题目6&#xff1a;rowspan 题目7&#xff1a;colspan 题目8&#xff1a;汇总题 题目1&#xff1…

从零到一构建短链接系统(八)

1.git上传远程仓库&#xff08;现在才想起来&#xff09; git init git add . git commit -m "first commit" git remote add origin OLiyscxm/shortlink git push -u origin "master" 2.开发全局异常拦截器之后就可以简化UserController 拦截器可以…

Maxwell监听mysql的binlog日志变化写入kafka消费者

一. 环境&#xff1a; maxwell:v1.29.2 (从1.30开始maxwell停止了对java8的使用&#xff0c;改为为11) maxwell1.29.2这个版本对mysql8.0以后的缺少utf8mb3字符的解码问题&#xff0c;需要对原码中加上一个部分内容 &#xff1a;具体也给大家做了总结 &#xff1a; 关于v1.…

【Godot4.2】随机数入门指南

概述 计算机程序是精确的艺术&#xff0c;现实生活却充满了随机性。如果你的游戏缺乏了随机性&#xff0c;也就缺乏了最基础的乐趣。 我们在很多场景下需要使用随机数&#xff0c;来为已经非常刻意和规整的设计带来一些变化和趣味。 比如打怪、打完Boss或开宝箱后随机掉落不…

在MongoDB建模1对N关系的基本方法

“我在 SQL 和规范化数据库方面拥有丰富的经验&#xff0c;但我只是 MongoDB 的初学者。如何建立一对 N 关系模型&#xff1f;” 这是我从参加 MongoDB 分享日活动的用户那里得到的最常见问题之一。 我对这个问题没有简短的答案&#xff0c;因为方法不只有一种&#xff0c;还有…

软件系统开发设计的基本流程

一、前言 经过年的工程实践软件系统开发的流程演变有很多种&#xff0c;但是最基本的还是瀑布模型。但是由于近几年演变了很多种模型&#xff0c;现在很多公司的研发流程并不遵循瀑布模型。主要原因是无法满足市场竞争的需求。比如在哪某个节日需要敏捷上线活动等这样的场景。没…

ASP .Net Core 配置集合 IConfiguration 的使用

&#x1f433;简介 IConfiguration 是 ASP.NET Core 中的一个接口&#xff0c;用于表示配置集合。以下是关于 IConfiguration 的详细介绍&#xff1a; 作用&#xff1a;IConfiguration 允许开发人员从各种来源&#xff08;如文件、环境变量、命令行参数等&#xff09;读取应用…

inner join,left join,right join,outer join的区别

INNER JOIN&#xff1a;内连接是最常见的连接操作&#xff0c;它返回两个表中满足连接条件的交集。即只返回条件匹配的记录。 LEFT JOIN&#xff1a;左连接返回左表记录和右表记录匹配后组成的记录。以及左表中未与右表匹配的记录&#xff0c;右边用null显示。 RIGHT JOIN&…

好就业三种专业#信息安全#云计算#网络工程

一、信息安全专业 根据2021年网络安全宣传周白皮书的观察结果&#xff0c;网络安全产业对于人才的需求正以高速增长的趋势呈现&#xff0c;当前网络安全行业存在着巨大的人才缺口&#xff0c;平均供求比例约为1:2。这一现象导致了资深人才的储备不足&#xff0c;并且新人才的培…

如何画好架构图

什么是架构图&#xff1f; 架构图 架构的表达 架构在不同抽象角度和不同抽象层次的表达 架构可以从很多个角度去看&#xff0c;比如&#xff1a;业务架构、应用架构、技术架构、代码架构、数据架构等。 从架构级别来分类&#xff0c;使用金字塔的说明&#xff0c;上层级别…

图像分割论文阅读:Adaptive Context Selection for Polyp Segmentation

这篇论文的主要内容是关于一种用于息肉分割的自适应上下文选择网络&#xff08;Adaptive Context Selection Network&#xff0c;简称ACSNet&#xff09; 1&#xff0c;模型的整体结构 模型的整体结构基于编码器-解码器框架&#xff0c;并且包含了三个关键模块&#xff1a;局部…

贵州省二级分类土地利用数据(矢量)

贵州省&#xff0c;地处中国西南腹地&#xff0c;地貌属于中国西南部高原山地&#xff0c;境内地势西高东低&#xff0c;自中部向北、东、南三面倾斜&#xff0c;平均海拔在1100米左右。贵州高原山地居多&#xff0c;素有“八山一水一分田”之说。全省地貌可概括分为&#xff1…

【鸿蒙HarmonyOS开发笔记】通知模块之为通知添加行为意图

概述 WantAgent提供了封装行为意图的能力&#xff0c;这里所说的行为意图主要是指拉起指定的应用组件及发布公共事件等能力。HarmonyOS支持以通知的形式&#xff0c;将WantAgent从发布方传递至接收方&#xff0c;从而在接收方触发WantAgent中指定的意图。例如&#xff0c;在通…

RK3568平台开发系列讲解(pinctrl篇)引脚的复用关系的设置

🚀返回专栏总目录 文章目录 一、调用pinctrl_bind_pins二、dev_pin_info结构体沉淀、分享、成长,让自己和他人都能有所收获!😄 引脚的复用关系是在什么时候被设置的。 一、调用pinctrl_bind_pins 在内核源码目录下的 “drivers/base/dd.c” 文件中 static int really_p…

Java项目:67 ssm家政服务网站设计+jsp

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 家政服务网站&#xff0c;主要的模块包括查看 管理员&#xff1b;个人中心、用户管理、服务类型管理、家政类型管理、家政评价管理、家政资讯…

Cesium for UE-01-虚幻引擎的下载安装及插件配置

学习Cesium for UE的过程笔记 下载UE 下载 下载完成后&#xff0c;点击运行&#xff0c;执行安装 安装完成后需要下载epic game 下载完成&#xff0c;需要登录 没有账号的自行注册&#xff0c;或者选一个有账号的平台登录即可 选择虚幻引擎&#xff0c;再点击库 可以看到下…

课时70:流程控制_for循环_嵌套循环

2.4.4 嵌套循环 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 这里的嵌套实践&#xff0c;与选择语句的嵌套实践基本一致&#xff0c;只不过组合的方式发生了一些变化。常见的组合样式如下&#xff1a;for嵌套for语句for …

【工具使用】VScode配置gcc开发环境

一&#xff0c;简介 本文主要介绍如何在VScode中配置gcc环境&#xff0c;方便开发调试。 二&#xff0c;配置步骤 2.1 gcc环境配置 2.1.1 安装gcc环境 这里我使用的是msys2&#xff0c;具体安装步骤可以参考我另外一篇文章《史上最全msys2下载配置操作步骤》&#xff0c;这…