【C语言】整数和浮点数在内存中的存储

前言

我们都知道,在创建一个变量的时候,编译器会自动开辟一块内存空间用于存放它,但是对于不同的数据类型,它们的存储形式也会有所不同。今天就让我们一起来学习整数和浮点数在内存中的存储

1. 整数在内存中的存储

我们都知道,一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机中机器数的最高位的1位是被当作符号位,用来存放符号,剩余的都是数值位

在符号位上,用 0 表示正数,用 1 表示负数

正整数的原、反、补码都相同

负整数的原、反、补码不尽相同

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

反码:原码的符号位不变,其他位次全部取反得到的就是补码

补码:反码 + 1 得到的就是补码

对于整数来说,数据在内存中都是以补码形式存放的,因为只有补码才方便机器将符号位和数值位统一处理,具体原理有些复杂,感兴趣的朋友可以自行查取资料

2. 大小端字节序和字节序判断

2.1 什么是大小端字节序

一个整数在内存中占据 4 个字节,它的大小已经超出了 1 个字节,那它的内存存储就必然需要把字节一一排序,这就是所谓的字节序。按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储。

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

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

不同编译器不同环境的存储方式都有可能不同,我们常见的 X86 环境是小端模式,有些 ARM 处理还可以通过硬件来选择存储方式

2.2 怎么判断当前机器的字节序

思路:我们的目的是判断字节序,因此可以从内存入手,并使用字符指针强转取出高位字节,此时再来判断就轻而易举

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

运行结果如下

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

在讲这个之前,我们先来看一段代码

#include <stdio.h>int main()
{float a = 99.7;printf("%f\n", a);return 0;
}

大家可以猜一下运行结果是什么?有人可能会说,不就是 99.7 嘛,用得着猜嘛。那我只能很遗憾的告诉你,回答错误

奇了怪了,为什么会是这么个奇怪的数字呢?哎,我接下来要讲的浮点数在内存中存储就能为你答疑解惑

3.1 浮点数的存储

根据规定,任何一个二级制浮点数 V 都可以表示成下面的形式

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

  • (-1)^S 表示符号位,当 S 等于 0 时表示正数,当 S 等于 -1 时表示负数
  • M 表示有效数字,且 M 是大于 1 小于 2
  • 2^E 表示指数位

 举个例子:

十进制 5,写成二进制是 101,就相当于 1.01 * 2^2

此时 S = 0,M= 1.01,E = 2

对于 32 位的浮点数,最高 1 位存储符号位 S,接下来的 8 位存储指数 E,剩下的 23 位存储 M

对于 64 位的浮点数,最高 1 位存储符号位 S,接下来的 11 位存储指数 E,剩下的 23 位存储 M

                                                                                              32 位浮点数

3.2 浮点数存储的过程

  • 因为 M 始终是大于 1 小于 2 的数,所以 M 的在存储的过程中整数部分可以省略,只保存小数部分
  • 对于指数 E,在存入的过程中必须再加上一个中间数,8 位的 E 需要加上 127;11 位的 E 需要加上 1023

3.3 浮点数取出的过程

一般只看 E,E 不全为 0 或不全为 1 时,要把 E 的计算值再减去中间数(127/1023),得到真实值,再将有效数字 M 前加上第一位的 1;E 全为 0 或全为 1 的情况比较少见,表示的是无穷小和无穷大的数,无实际意义

结语

今天我们一起学习了整数和浮点数在内存中是如何存储的知识点;如有总结不到位的地方还请多多谅解,若有出现纰漏,希望大佬们看到错误之后能够在私信或评论区指正,博主会及时改正,共同进步!
欢迎各位在评论区友好讨论。如果觉得不错的话,麻烦您点个赞吧,十分感谢!

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

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

相关文章

leetcode刷题(剑指offer) 10.正则表达式匹配

10.正则表达式匹配 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 示例 1&#xff1a;…

Linus Torvalds的20个事实

Linus Torvalds 是 Linux 操作系统的创造者&#xff0c;至今还在维护内核。本文是他的自传《Just for fun》的简短摘录&#xff0c;关于他个人的20个事实&#xff0c;比如他的老婆是他的学生。 Brief: Some known, some lesser known – here are 20 facts about the Linus Tor…

外汇天眼:Cryptodfmeta与Aden Markets──网恋对象热心带投资,鼓吹加码冻账拒出金

随着整个人类社会进入数字时代&#xff0c;我们愈来愈仰赖网络科技的便利性&#xff0c;由于远端工作逐渐成为趋势&#xff0c;就连社交与人际互动也开始云端化。 与此同时&#xff0c;诈骗集团也在各大社交平台申请假账号并寻找下手目标&#xff0c;并且诱骗人使用虚假的投资平…

JSON概述以及使用

1&#xff0c;JSON 1.1 概述 概念&#xff1a;JavaScript Object Notation。JavaScript 对象表示法. 如下是 JavaScript 对象的定义格式&#xff1a; {name:"zhangsan",age:23,city:"北京" } 接下来我们再看看 JSON 的格式&#xff1a; {"name&…

C++文件操作(1)

C文件操作 1.文本的写入及读取文本文件写入文本文件读取 2.二进制文件的写入及读取二进制文件写入二进制文件读取 3.小结 C也有处理文件的能力&#xff0c;其功能实现依赖文件流。文件流是C中用来处理文件输入输出的一种流类。文件流可以用于从文件中读取数据或将数据写入到文件…

uni-app小程序自定义导航栏

最近在开发一个uni-app小程序&#xff0c;用到了自定义导航栏&#xff0c;在这里记录一下实现过程&#xff1a; page.json 在对应页面路由的style中设置入"navigationStyle": "custom"取消原生导航栏&#xff0c;自定义导航栏 {"path": "…

【ARM Trace32(劳特巴赫) 使用介绍 6.1 -- 外设寄存器查看与修改】

请阅读【Trace32 ARM 专栏导读】 文章目录 外设寄存器查看与修改寄存器值修改外设寄存器查看与修改 外设寄存器的查看与修改,离不开TRACE32的外设文件(*.per),per文件一般存在于TRACE32的安装根目录下。 一般情况下,在调试时,TRACE32会根据当前选择的芯片名自动选择合适的…

正则表达式(RE)

什么是正则表达式 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;。正则表达式通常被用来检索、替换那些符合某个规则的文本 正则表达式的作用 验证数据的有效性替换文本内容从字符串中提取子字符串 匹配单个字符 字符功能.匹配任意1个…

P1596 [USACO10OCT] Lake Counting S Flood Fill算法(洪水填充算法)

文章目录 题目链接题目描述解题思路算法原理实现方法复杂度分析 代码实现总结 题目链接 链接: P1596 [USACO10OCT] Lake Counting S 题目描述 解题思路 本题我在acwing和洛谷上都看到了 做这道题首先要了解一下Flood Fill 算法&#xff08;洪水填充算法&#xff09; 作为一个…

数据库MySQL查询设计||给定四个关联表,其定义和数据加载如下:-- 学生表 Student-- 选课表 SC

SQL查询设计 给定四个关联表&#xff0c;其定义和数据加载如下&#xff1a; -- 学生表 Student create table Student(Sno varchar(6), Sname varchar(10), Sdate datetime, Ssex varchar(10)); insert into Student values(01 , 赵雷 , 1999-01-01 , 男); insert into St…

重发布

一&#xff1a;作用 在两种路由协议之间&#xff0c;或者一个协议的不同进程之间&#xff0c;借助ASBR &#xff08;同时工作在两种协议或 者协 议的不同进程中&#xff09;学习到两个网络的路由信息&#xff0c;并且通过重发布进行路由共享&#xff0c;最终实现全网可 达。…

tarojs View多行文本无法换行问题解决

问题&#xff1a;未换行 code&#xff1a; 解决&#xff1a; 加上换行属性的css就好了 white-space: break-spaces;