搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
繁依Fanyi0
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
你的 App 还能在后台启动 Activity 吗(非 AndroidQ 适配)_应用处于后台时,无法启动activity
2
redis整合spring(redisTemplate工具类)_redistemplate.opsforhash().put(key, item, value);
3
CleanMyMac X 4.14.6 for Mac 最新中文破解版 系统优化垃圾清理工具_cleanmymac x for mac
4
使用cornerstone在branch和trunk之间merge_cornerstone地址切换至trunk
5
android9第三方ROM,一加7 Pro官方安卓9.0稳定版全量固件rom刷机包第3版:21.H.09
6
组件化之组件通讯和APT、JavaPoet使用(二)_javapoet和反射
7
ChatGPT原理及源代码_chatgpt源码
8
pb90代码如何连接sql2008r2_如何创建Raspberry Pi灯光秀
9
Vue2.0 源码阅读:响应式原理 侵立删_this.getter.call
10
QT自定义标题栏
当前位置:
article
> 正文
【C语言】数据在内存中的存储(包含大小端字节序问题)~
作者:繁依Fanyi0 | 2024-03-20 09:12:28
赞
踩
【C语言】数据在内存中的存储(包含大小端字节序问题)~
一、前言
我们在刚开始学习C语言的时候,就接触到了很多
数据的不同类型
。
我们也知道,数据是存储在一块内存空间的,且我们只知道数据的类型决定着,该数据在内存中所占内存空间的大小,
且超过一个字节的数据在内存中存储的时候,就有(以字节为单位)存储顺序的问题。
可我们
更应该知道,数据不仅仅只是存储到指定的空间就完事了,而是不同类型的数据有它相对应的存储原则的。
这篇文章就是
讲解不同类型的数据是在内容中的存储方式+大小端字节序
。
(本篇文章只对整型家族与浮点型家族对其在内存中的布局进行详解)待更~
二、整型数据在内存的存储
1.如何存储整型数据?
整数的二进制表示形式有三种:原码
(整数数据按照二进制的转换后,得到的就是原码)
、反码、补码。
而整数在内存中是以补码的形式存储的。
这三种表示形式都有符号位与数值位,
符号位用‘1’表示负,用‘0’表示正,而符号位是数值位的最高一位作为符号位
。
若整数类型是无符号整型,则会把最高位也看成数值位,而把数据默认为正数。且它的反码与补码都等于原码
当是有符号的整数时,整数为正时,原码、反码、补码相同。
为负的时候,则需要按照下面的运算法则得到补码。
原码(整数数据按照二进制的转换后,得到的就是原码);反码(原码,保持符号位不变,其余位按位取反(~)得到反码);补码(反码 + 1得到补码)。
补:补码按照同样的运算法则,可以得到原码。
2.补码的意义是什么?
补码可以让在内存中存储的整数数据,符号位与数值位统一处理。
CPU只有加法器,无论进行加法还是减法,两数补码直接相加即可
原码转换为补码;补码转换原码,运算法则相同。(符号位不变,数值位按位取反,后+1)
3.如何读取整型数据?
整型数据的读取较为简单,怎么存的怎么读出来就行
首先,判断该数据类型是否是整型类型
其次,判断该整数是signed的整型类型还是unsigned整型类型
若为,若为signed的整型类型,且存的整数是负数,需紧记原反补的转换!!!
三、浮点型数据在内存中的存储
1.如何存储浮点型数据(伏笔)
(-1)^S * M * 2^E
任何一个二进制的浮点型数据,都可以用上面的科学计数法表达式来表示;
S:用于决定该浮点型数据的正负号,S=0时,数据的正负性为正,S=1时,数据的正负性为负。
M:是一个>1 且 <2的有效数字(我们联想到十进制的科学计数法的有效数字也就能理解到这点)。
E:是一个指数
S M E在内存中的布局
(下面的的讲解都将以float类型展开,也就是4字节的)
2.如何存储浮点型数据(开始)
上面只是介绍了一些有关存储浮点型数据的相关的概念,可这些不足以让我们深入理解到浮点型到底在内存中是如何存储的。
存储S数据:
很简单,数据是正的,S位上就是0,反之,位1。
存储M数据:
因为我们都知道M都是一个
>1 且 <2
的有效数字;
为了能让内存得到更高效的利用,在M中的数据存储到内存的时候,都会将M小数点前面的1省去,只保留小数部分。
而等我们读取数据的时候,会将M的1再补上去,这样就更高效的利用了一个比特位。
存储E数据:
E是一个无符号整型数据,可是浮点型数据是有正负性之分的,那如何去解决这一难题呢?
我们在存储E的数据的时候会加上一个中间值,进行转换,存储到内存中。
读取的时候,也会把得到的数据减去这个中间值。
中间值是什么?
用8比特位存储E数据的时候,其中间值是127(255/2)
用11比特位存储E数据的时候,其中间值是1023(2047/2)
(
这里我将举两个例子
)
3.如何读取浮点型数据(结尾)
只要理解了如何存储浮点型数据,那读取数据就迎刃而解(怎么走的,就怎么回来),但是也有一些特殊的地方,比如对E数据的读取。
存储E数据的比特位全为0的时候:(这是一个无限小的数字)
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字
存储E数据的比特位全为1的时候:(这是一个无限大的数字)
这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s);
E不全为0或不全为1
怎么存E的数据,就怎么读取就行。
四、大小端字节序
1.概念的引出
2.大小端字节序的概念
小端字节序存储:
高位的数据存储的高地址处;低位的数据存储到低地址处
大端字节序存储:
高位的数据存储的低地址处;低位的数据存储到高地址处
3.如何判断当前机器的字节序是哪种类型
不同平台的是大端字节序的存储,还是小端字节序存储是不一样的,我们能做的就是通过一定的手段获得机器是大端字节序存储,还是小端字节序存储。
指针求解:
联合体求解:
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/272253
推荐阅读
article
Java
单元测试
AI工具-
Diffblue
Cover
...
总之,使用
Diffblue
可以帮助开发人员快速、准确地发现代码中的错误和漏洞,并生成相应的测试用例。如果测试结果不满足要...
赞
踩
article
机器学习-
Ra
in
-
in
-
Australia
_机器学习
ra
in
in
australia...
Ra
in
-
in
-
Australia
Mach
in
e lear
in
g by xgboost项目旨在通过机器学习算法寻找一个有...
赞
踩
article
热门
技术
问答 | 请
GaussDB
用户
查收...
近年来,Navicat 与华为云
GaussDB
展开一系列
技术
合作,为
GaussDB
用户
提供面向管理开发工具的生态...
赞
踩
article
Pytorch
Tensor
以及
Tensor
的基本
数据类型
_
tensor
type
...
Pytorch中的基本
数据类型
就是的张量(torch.
Tensor
),张量(torch.
Tensor
)可以理解为多维矩阵...
赞
踩
article
Android
Studio
使用教程(一)之怎么新建一个
java
接口_
android
studio
...
android
开发
android
studio
怎么新建一个接口 右键点击你想新建的目录,选择"New"->"Java...
赞
踩
article
高效
性能
监测解决方案:
Docker
+
Jmeter
+
InfluxDB
+Grafana搭建强大
性能
监测平...
使用
Docker
+ JMeter +
InfluxDB
+ Grafana 到底可以搭建怎样的
性能
监控平台呢?相比较...
赞
踩
article
Win10
/
Win7
小技巧:教你如何彻底
关闭
系统
进程
_
怎么永久
关闭
自启
进程
...
无论Windows 10打过多少补丁,官方说的有多么完美,运行卡顿和程序假死还是常有的事儿。这个时候常规的解决方案就是用...
赞
踩
article
应用程序设计之(4)
linux
进程
间通信
_
shmget
ipc
_
creat
需要权限...
七种进程
间通信
大详解_
shmget
ipc
_
creat
需要权限
shmget
ipc
_
creat
需要权限 ...
赞
踩
article
奇异
值
分解
(
SVD
)原理_
奇异
值
分解
与
坐标
变换
...
文章来自
奇异
值
分解
(
SVD
)原理 - JackGao的博客 - CSDN博客 ...
赞
踩
article
MIPS
汇编
指令集
...
MIPS
汇编
MIPS
指令集
MIPS
指令集
属于精简
指令集
MIPS
的所有指令都是32位,指令格式简单,而X86的指令长度不是...
赞
踩
article
实战
PyQt5
: 032-
按钮
盒控件
QDialogButtonBox
_
pyqt
buttonbox
...
QDialogButtonBox
简介通常情况下,对话框和消息框都有一组标准布局的
按钮
,
QDialogButtonBox
部...
赞
踩
article
clickhouse
突然
启动
不
起来
问题排查...
在实现postgreql数据迁移到
clickhouse
中,想使用MaterializedPostgreSQL的功能实现,...
赞
踩
article
Linux
系统
进程
输出与
统计
模块_
统计
进程
数量
...
tip:需要用上list_for_each()和list_entry()内核函数。_
统计
进程
数量
统计
进程
数量
...
赞
踩
article
串行
、
并行
和并发的
区别
_
流程图
并行
和
串行
的
区别
...
串行
并行
和并发的
区别
_
流程图
并行
和
串行
的
区别
流程图
并行
和
串行
的
区别
串行
是在时间上不允许重叠,...
赞
踩
article
MIPS
汇编
总结...
一、
汇编
指令1.为了简化处理器的设计,
MIPS
处理器采用了固定结构的
汇编
指令:每个指令由4个部分组成:1个操作符+3个操...
赞
踩
article
springboot
_
idea2019
springboot
mvc
项目打包 unable to a...
Spring Boot Reference GuideAuthorsPhillip Webb, Dave Syer, J...
赞
踩
article
2022爱分析・
银行
数字化
实践报告_人民
银行
开发
能力
不足
...
2022爱分析・
银行
数字化
实践报告_人民
银行
开发
能力
不足
人民
银行
开发
能力
不足
...
赞
踩
article
【
Android
开发经验】比
Gson
解析速度快10倍!——
Json
解析神器
Jackson
使用
介绍
_a...
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 因为在之前的项目中,xml和...
赞
踩
article
AI
辅助
研发
:
技术
前沿
、
行业
实践与未来之路...
本文探讨了
AI
辅助
研发
领域的多个方向,包括
技术
进展
、
行业
应用案例
、
挑战与机遇,以及人才培养与教育。首先介绍了
AI
辅助
研发
...
赞
踩
article
Navicate
连接
新买的云
服务器
数据库
连接
不上
问题_
navicate
连
不上
华为云...
Navicate
连接
新买的云
服务器
数据库
连接
不上
问题最近心血来潮买了个
服务器
玩玩,然后新建的
数据库
本地一直
连接
不上
,好...
赞
踩
相关标签
ai
python
机器学习
svm
navicat
数据库
gaussdb
pytorch
android studio
android 开发
android studio 创建接口
android studio 创建接口类
创建接口类
docker
jmeter
grafana
性能优化
selenium
功能测试
c语言
linux
服务器
pyqt5
pyside2