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

Tiny Spark get dazzling some day.

目录

  • 1. 整数在内存中的存储
    • 1.1 原码、反码、补码
    • 1.1 大小端存储
      • 1.2.1 字节序分类
      • 1.2.2 判断字节序
  • 2. 浮点数在内存中的存储
    • 2.1 浮点数的存储形式
    • 2.2 浮点数的 “ 存 ”
      • 2.2.1 S
      • 2.2.2 E
      • 2.2.3 F
    • 2.3 浮点数的 “ 取 ”
      • 2.3.1 S
      • 2.3.2 E、F
  • 3. 浮点数存储例题

1. 整数在内存中的存储

1.1 原码、反码、补码

我们都知道,数据在二进制中都是以 二进制 的形式存储在计算机中,而二进制只有 01两个数字。

有符号整数的二进制序列中,最高位 称 符号位,表示正负;其他位 称 数值位,表示数值。
无符号整数的二进制序列中,没有符号位,即每一位 均为 数值位
有多少位具体看 该整数的类型大小,比如 int 类型的

整数 的二进制表示 有三种,分别为 原码反码补码(数据存放在内存中的就是 补码 !)。
整数的三种码都是一样的,负数的则有所不同:

  • 原码 是整数数值直接翻译成 二进制 所得。
  • 反码 是将 原码 的符号位不变,其他数值位按位取反所得。
  • 补码反码 + 1 所得。
  • 若从
    举个例子
  • 整数十进制:-1
  • 原码:1 0 0 0 0 0 0 1
  • 反码:1 1 1 1 1 1 1 0
  • 补码:1 1 1 1 1 1 1 1

1.1 大小端存储

先来看个例子

// 我们在编译器中创造一个变量, 看看它在内存中的存储情况
int a = 0x11223344; // 用十六进制数值对 变量a 进行初始化赋值

开启调试 打开内存监视窗口 看一下
在这里插入图片描述
一开始的时候我也有点懵逼,这里不应该是显示为 11 22 33 44 这样吗?
后来我了解到,当 数据大小 >= 2个字节 ,在内存中存储的时候,就会有 字节序 的问题。
存储顺序 就分为 大端存储小端存储

1.2.1 字节序分类

在这里插入图片描述

在这里插入图片描述

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

简记:
(内容)(顺序)(内容)(顺序)
大端
小端

那么,我们该如何知道当前机器的字节序呢?

1.2.2 判断字节序

  • 第一种
int check()
{int i = 1;return (*(char*)&i);
}
int main()
{int ret = check();if(ret == 1){printf("小端存储\n");}else{printf("大端存储\n");}return 0;
}

在这里插入图片描述

  • 第二种
int check()
{union // 在联合体中 a 和 b 共用同一块空间{int a;char b;}un;un.i = 1;return un.b;
}
int main()
{int ret = check();if(ret == 1){printf("小端存储\n");}else{printf("大端存储\n");}return 0;
}

在这里插入图片描述


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

2.1 浮点数的存储形式

上图获取来自百度百科: IEEE 754:浮点数表示

根据上面的资料,那么任意浮点数 V(Value) 可以表示为
在这里插入图片描述

  • (-1) ^ S 表示表示符号位 正负
  • F 表示 大于等于1小于2 的 有效数字
  • 2 ^ E 表示 指数 位(E 是 unsigned int 无符号整数类型)

举例:
十进制数 9.0 转换称二进制为 1001.0,用科学计数法来表示就是 1.001 x 2 ^ 3
那么, S = 0, F = 1.001,E = 3

单精度的浮点数 和 双精度的浮点数 在内存分配的空间是不同的

  • float 类型的浮点数内存分配

在这里插入图片描述

  • double 类型的浮点数内存分配

在这里插入图片描述

2.2 浮点数的 “ 存 ”

2.2.1 S

首个比特位存 S 表示浮点数的 正负(0 或 1)

2.2.2 E

前面我们了解到,E 是一个无符号整数,在 float类型浮点数中有占 8个比特位,取值范围 0 ~ 255,
double类型浮点数中占 11个比特位,取值范围 0 ~ 2047,也就是说 E 是一个非负整数。
但在科学计数法,是允许存在 负数的 E 存在的。

所以,IEEE 754 制定了规定:

E 存入内存时,其真实值必须加上其取值范围的中间数,float类型的为 127,double类型的则为
1023. 比如,2 ^ 8 的 E 是 8,在存入内存时要 + 127 = 135(假设是单精度浮点数类型),即为二进制 10000111

在这里插入图片描述
资料来自百度百科IEEE 754:指数偏差

偏移值就是 内存值(E存入内存值)真实值(E原值) 的差

2.2.3 F

F大于等于1小于2 的,对于任何浮点数都几乎可以表示 1.xxxxxxxxx
“ 存 ” 的时候,F 只存小数部分的 xxxxxxxxx ;在 “ 取 ” 的时候,再把整数部分的 1 加上去

有啥作用?

(假设是单精度浮点数类型)F在存的时候占23位bit,如果把整数的 1 也存进去的话,小数部分能存22位。 但是如果在 “ 存 ”
的时候,F 只存小数部分的 xxxxxxxxx ;在 “ 取 ” 的时候,再把整数部分的 1 加上去,
那就可以节省1位有效数字,小数部分就可以存23位多一位。

2.3 浮点数的 “ 取 ”

2.3.1 S

S (0 或 1)就正常取,是啥取啥就完了

2.3.2 E、F

  • E 不全为 0 或 不全为 1

在这里插入图片描述

这种情况下只要把 E 减去原来加上的中间值127(float)或1023(double)得到真实值的 E
F 把整数部分的 1 加上小数部分即可

  • E 全为 0

在这里插入图片描述

这种情况表示 浮点数是一个接近0的很小的数 或者就是 0
E 减去原来加上的中间值127(float)或1023(double)得到真实值的 E
F 不再加上整数部分的 1 ,而是还原为 0.xxxxxxxxx 的小数

  • E 全为 1
    在这里插入图片描述
    如果 F 全为 0,则表示这是一个 正无穷大负无穷小 的 浮点数(取决于符号位 S
    E 减去原来加上的中间值127(float)或1023(double)得到真实值的 E

3. 浮点数存储例题

#include <stdio.h>
int main()
{int n = 9;float *pFloat = (float *)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);*pFloat = 9.0;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);return 0;
}

输出结果是什么?
在这里插入图片描述

为何有这样的变化?

在这里插入图片描述
我们可以看到 指数 E 部分全为0,说明转化后的小数是一个接近0的很小的数,

0.000000000...后面不全为0,但不为0的数也是在非常后面

而我们使用 printf 函数打印浮点数的时候,再没有限定小数位数的情况下, 默认输出小数点后6位
所以我们看到输出结果的第二行就是

*pFloat的值为:0.000000 // 后面的就不输出了

继续往下,为何第二次打印 n 的值,会变得这么大?
在这里插入图片描述
01000001000100000000000000000000 转化为十进制就为 1091567616

  
  
  Stay hungry. Stay Foolish. 饥渴求知,虚怀若愚。
  感谢各位读者支持,虚心请教,如有错漏或可改进点,请任意指出,感激不尽!
  一起进步!


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

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

相关文章

读取打包到JAR中的文件:常见问题与解决方案(文件在但是报错not find)

读取打包到JAR中的文件&#xff1a;常见问题与解决方案 喝淡酒的时候&#xff0c;宜读李清照&#xff1b;喝甜酒时&#xff0c;宜读柳永&#xff1b;喝烈酒则大歌东坡词。其他如辛弃疾&#xff0c;应饮高梁小口&#xff1b;读放翁&#xff0c;应大口喝大曲&#xff1b;读李后主…

学习c#第26天 面向对象基础之类与对象

1.类 1.什么是类? 俗话说&#xff0c;“物以类聚&#xff0c;人以群分”。意思是同类的东西经常聚在一起&#xff0c;志同道合 的人相聚成群。前者说物&#xff0c;后者说人。这里以物来进行举例说明[见图]&#xff1a; 水果超市&#xff0c;所有同类的水果摆放在一起&#xf…

PHP 框架安全:ThinkPHP 序列 漏洞测试.

什么是 ThinkPHP 框架. ThinkPHP 是一个流行的国内 PHP 框架&#xff0c;它提供了一套完整的安全措施来帮助开发者构建安全可靠的 web 应用程序。ThinkPHP 本身不断更新和改进&#xff0c;以应对新的安全威胁和漏洞。 ThinkPHP 框架的安全特性&#xff1a; (1) 输入过滤和验证…

【go项目01_学习记录05】

学习记录 1 依赖管理 Go Modules1.1 弃用 $GOPATH1.2 Go Modules 日常使用1.2.1 初始化生成go.mod文件1.2.2 Go Proxy代理1.2.3 go.mod文件查看1.2.4 go.sum文件查看1.2.5 indirect 含义1.2.6 go mod tidy 命令1.2.7 清空 Go Modules 缓存1.2.8 下载依赖1.2.9 所有 Go Modules …

[qnx] 通过zcu104 SD卡更新qnx镜像的步骤

0. 概述 本文演示如果给Xlinx zcu104开发板刷入自定义的qnx镜像 1.将拨码开关设置为SD卡启动 如下图所示&#xff0c;将1拨到On,2,3,4拨到Off&#xff0c;即为通过SD启动。 2.准备SD卡中的内容 首先需要将SD格式化为FAT32的&#xff08;如果已经是FAT32格式&#xff0c;则…

网络安全之OSI七层模型详解

OSI七层模型分为控制层&#xff08;前三层&#xff09;和数据层&#xff08;后四层&#xff09;。从第七层到一层为&#xff1b; 应用层&#xff08;7&#xff09;接收数据 表示层&#xff08;6&#xff09;将数据翻译为机器语言 会话层&#xff08;5&#xff09;建立虚连接…

C++证道之路第十八章探讨C++新标准

一、复习前面介绍过的C11新功能 1、新类型 C11新增了类型long long 和unsigned long long 新增了类型char16_t 和char32_t 2、统一的初始化 C11扩大了用大括号括起的列表&#xff08;初始化列表&#xff09;的使用范围&#xff0c;使其可以用于所有内置类型和用户定义的类…

可编程 IP 新星 Story Protocol 何以引领链上文艺复兴浪潮?

当前&#xff0c;随着 Web3 行业发展进入全新阶段&#xff0c;与生成式人工智能&#xff08;AIGC&#xff09;技术融合正在创造潜力新星项目。也是目前的互联网生态下&#xff0c;任何普通民众都有权利创作高质量的音乐、艺术、散文和视频内容&#xff0c;带来了用户生成内容&a…

算法(C++

题目&#xff1a;螺旋矩阵&#xff08;59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09;&#xff09; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&am…

Vue进阶之Vue项目实战(二)

Vue项目实战 构建基础框架路由 项目&#xff08; v1.0,base-app-layer&#xff09;导航 router物料编排选型 插件化插件化平时写代码场景 配置器开发 构建基础框架 路由 路由分类&#xff1a; memoryHistory&#xff1a;内存路由&#xff0c;路由信息记录在内存中&#xff0…

解决github的remote rejected|git存储库的推送保护

前言 git存储库的推送保护。当你试图推送代码到GitHub仓库时&#xff0c;由于存在与主分支&#xff08;master&#xff09;相关的仓库规则违规行为&#xff0c;推送会被拒绝了。这种保护机制帮助确保只有经过授权和符合规定的代码才能被合并到主分支&#xff0c;从而保护了主分…

Unreal Engine插件打包技巧

打开UE工程&#xff0c;点击编辑&#xff0c;选择插件&#xff0c;点击"打包"按钮&#xff0c;选择输出目录UE4.26版本打包提示需要VS2017问题解决 1&#xff09;用记事本打开文件【UE4对应版本安装目录\Epic Games\UE_4.26\Engine\Build\BatchFiles\RunUAT.bat】 2&…

Linux网络部分——DNS域名解析服务

目录 1. 域名结构 2. 系统根据域名查找IP地址的过程 3.DNS域名解析方式 4.DNS域名解析的工作原理【☆】 5.域名解析查询方式 6.搭建主从DNS域名服务器 ①初始化操作主服务器和从服务器&#xff0c;安装BIND软件 ②修改主服务器的主配置文件、区域配置文件、区域数…

pyside6的调色板QPalette的简单应用

使用调色板需要先导入:from PySide6.QtGui import QPalette 调色板QPalette的源代码&#xff1a; class QPalette(Shiboken.Object):class ColorGroup(enum.Enum):Active : QPalette.ColorGroup ... # 0x0Normal : QPalette.ColorGrou…

鸿蒙内核源码分析(消息队列篇) | 进程间如何异步传递大数据

基本概念 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构。队列接收来自任务或中断的不固定长度消息&#xff0c;并根据不同的接口确定传递的消息是否存放在队列空间中。 任务能够从队列里面读取消息&#xff0c;当队列中的消息为空时&#xff0c;挂起读取任务…

文献速递:深度学习医学影像心脏疾病检测与诊断--从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测

Title 题目 Deep Learning Coronary Artery Calcium Scores from SPECT/CT Attenuation Maps Improve Prediction of Major Adverse Cardiac Events 从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测 01 文献速递介绍 低剂量非门控CT衰减校正&am…

java之web笔记

1.Servlet技术 1.1 JavaWeb概述 在Sun的Java Servlet规范中&#xff0c;对Java Web应用作了这样定义:“JavaWeb应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的Servlet容器中运行。 Java Web应用中可以包含如下内容…

智能AI摄像头项目

项目概要 硬件说明&#xff1a;易百纳rv1126 38板&#xff0c;易百纳GC2053摄像头&#xff0c;拓展版&#xff08;自绘&#xff09;&#xff0c;屏幕驱动板&#xff08;自绘&#xff09;&#xff0c;3.1inch mipi屏&#xff0c;FT5316触摸屏 开发环境 硬件分析 开发环境及sd…

语音识别---节拍器

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

深度神经网络中的不确定性研究综述

A.单一确定性方法 对于确定性神经网络&#xff0c;参数是确定的&#xff0c;每次向前传递的重复都会产生相同的结果。对于不确定性量化的单一确定性网络方法&#xff0c;我们总结了在确定性网络中基于单一正向传递计算预测y *的不确定性的所有方法。在文献中&#xff0c;可以找…