首页 > 系统相关 >关于数据在内存中如何存储

关于数据在内存中如何存储

时间:2024-09-16 20:23:29浏览次数:11  
标签:存储 字节 符号 int 浮点数 内存 关于

1. 整数在内存中的存储

在讲解操作符的时候,我们就讲过了下⾯的内容: 整数的2进制表⽰⽅法有三种,即原码、反码和补码 有符号的整数,三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表 ⽰“负”,最⾼位的⼀位是被当做符号位,剩余的都是数值位。 

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

负整数的三种表⽰⽅法各不相同。 

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

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

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

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

2. ⼤⼩端字节序和字节序判断

#include<stdio.h>

int main()

{

int a = 0x11223344;

return 0;

}  

调试的时候,我们可以看到在a中的 什么呢? 0x11223344 这个数字是按照字节为单位,倒着存储的。

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

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

⼩端(存储)模式: 是 指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。 上述概念需要记住,⽅便分辨⼤⼩端 

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

 有各种各样的方式判断

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

这部分内容常见于大学计算机基础课程 

常⻅的浮点数:3.14159、1E10等,浮点数家族包括: 浮点数表⽰的范围: float.h 中定义 

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

⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2 

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

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为⼀个⽆符号整数(unsignedint) 

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

浮点数取的过程 

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

标签:存储,字节,符号,int,浮点数,内存,关于
From: https://blog.csdn.net/2402_86688931/article/details/142306502

相关文章

  • 内存函数的
    1.memcpy使⽤和模拟实现 void*memcpy(void*destination,constvoid*source,size_tnum);•函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。•这个函数在遇到'\0'的时候并不会停下来。•如果source和destination有任......
  • 范围 for,new 内存动态分配,nullptr
    范围for,new内存动态分配,nullptr范围forintmain(){intarr[]={11,12,13,14,15};for(autox:arr){//问题所在:需要将arr中的每一个都拷贝到x中去===>节省拷贝的方法:使用指针,提升效率cout<<x<<endl;}cout<<"============......
  • 关于码元 带宽 传输速率 奈奎斯特定理的理解
    首先是码元,码元代表的是固定时长的信号波形表示一位k进制数字,尤其注意可以是半个周期,也可以是数个周期,只需要注意是在固定时长就行,不与频率有直接关系,只要在带宽频率所显示的范围内并且可以被准确检测到数据就行。带宽,带宽应为能收到的最快频率和最慢频率的差值,单位为HZ。传输速......
  • AUTOSAR -- SHE 内存槽更新
    AUTOSAR--SHE内存槽更新引言AUTOSAR(AUTomotiveOpenSystemARchitecture)是一个开放的、标准化的汽车软件架构,旨在为汽车电子系统提供一个统一的软件平台。在AUTOSAR中,安全硬件扩展(SecureHardwareExtension,SHE)是一个关键组件,用于保护汽车电子控制单元(ECU)中的敏感数据和代码。S......
  • 内存对齐和缓冲区溢出攻击
    一、问候语欢迎你来到我的博客!二、什么是内存对齐  计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定的规则......
  • ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)
    名词缩写ASID:AddressSpaceID地址空间标识符CD:ContextDescriptor;上下文描述符;CTP:Context-tablepointer上下文表指针EPT:ExtendedPageTable扩展页表GPA:GuestPhyicalAddress客人的实际地址GVA:GuestVirtualAddress访客虚拟地址HPA:HostPhyicalAddress......
  • 掌握C语言动态内存分配:从入门到精通,一次搞定!
    在C语言开发中,内存管理是一个非常重要但常被忽略的话题。与一些高级语言(如Java或Python)不同,C语言不会自动管理内存,开发者需要自己处理内存的分配和释放。虽然这种灵活性为程序的优化提供了巨大的可能性,但它也意味着更高的风险:如果不小心,就容易引发内存泄漏、空指针错误、内存越......
  • 小林coding学习笔记(内存页面置换算法)
    缺页中断示意图1在CPU里执行一条查找某个页面A的指令,首先是虚拟内存,会到虚拟内存和物理内存的映射关系的页表中查询。2页表中不存在需要查找的页面A的有效信息。3则触发缺页中断信号给操作系统,操作系统收到缺页中断信号后,就会去磁盘里面查找该页面。4操作系统在磁盘中查......
  • 使用 O(1) 额外内存删除二叉树
    这是一个naive的做法:voiddeleteTreeRec(TreeNode*root){if(root==NULL)return;deleteTreeRec(root->left);deleteTreeRec(root->right);cout<<"Deletingnode"<<root->data<<endl;deleteroot;}O(1)空......
  • 关于API淘宝数据接口
    在当今数字化商业时代,淘宝作为全球领先的电商平台,提供了丰富的API接口,使开发者能够高效地获取和管理电商数据。淘宝API接口不仅简化了与淘宝平台的交互,还为商家提供了强大的数据支持,帮助他们更好地分析市场趋势、优化店铺运营、提升用户体验。淘宝API接口概述淘宝API接口是一组......