IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 数据在内存中的存储 -> 正文阅读

[C++知识库]数据在内存中的存储

引言:我们计算机的数组究竟是怎么存储的呢,整数的存储与小数的存储有什么不一样呢,计算的时候会发生什么呢,存入的数据是怎么拿出来的呢,看完接下来的文章,相信你能解决这些问题

1.数据类型

2.整型的储存形式

3.浮点型的存储形式

4.大小端存储方式

1.数据类型

1.整型数据

在C语言中short,int,long,都是指signed 型即有符号型,但是char并不是,

char是否有符号取决于编译器,打大部分编译器都认为是有符号型

打印有符号整数用%d,打印无符号整数用%u

注意long 是4字节(long>=int)早期16位机器上int是2字节,所以有long 4字节 long long8字节

2.浮点型数据

float,double,一般flaot数据要在数据末尾加上f,否则默认是double型

如3.14 编译器认为是double型,3.14f是float型

3.构造类型

1.数组 (去掉数组就是数组类型)

下面是数组的初阶认识

CSDN

int a[10]={0};

把a去掉 int [10]就是类型 (大小为10的整型数组)

2.结构体,struct

3.枚举类型? enum

4.联合体 union

4.指针类型

下面有指针的入门介绍

?https://blog.csdn.net/AgoniTop/article/details/121432024

包括空指针类型 void*

void*是一种特殊的指针,他可以指向任何类型,但是void *?为 “不确定类型指针”,
void *不可以解引用,并且void*作变量给别的指针赋值前要强制转换类型,接下来看代码

这里void*并没有转换类型,但是他存储了int a的地址,但是不可以解引用,以及进行其他赋值操作,因为他还是void*类型

2.整型在内存中的存储方式

采用三种码制,原码,反码,补码(注意是整型,浮点型的存储在后面)

原码是直接根据最高位是符号位,其他根据数值大小填写的? ?如+1

就是 0000 0000 0000 0000 0000 0000 0000 0001 代表1的原码

反码就是在原码的基础上符号位不变,其他按位取反 (更~操作符不一样,~是全部按位取反)

补码就是在反码的基础上加1 (整数在计算机中存储的都是补码

正数只有一个码,负数则有三种码,并且在内存中以补码方式存在

———————————————————————————————————————————

那么为什么需要补码呢,直接采用原码计算不就行了吗?

1.事实上计算机只有加法器,就也是只能进行加速运算,若以原码计算会发生错误

如1+(-1)

0000 0000 0000 0000 0000 0000 0000? 0001? 1的原码

1000 0000 0000 0000 0000 0000 0000 0001? ? -1的原码

————————————————————相加得

1000 0000 0000 0000 0000 0000 0000 0010? ? ?也就是-2(结果错误)

采用补码相加得方式主要遵循一个原则:整数加负数==0

?0000 0000 0000 0000 0000 0000 0000? 0001? 1的补码? ?

?1111 1111 1111 1111 1111 1111 1111 1111? ? ? ? ? -1补码

——————————————————————相加得

?1 0000 0000 0000 0000 0000 0000 0000? 0000(33位)最前面进一越过该计算的存储空间,因此直接舍弃,此时1+(-1)=0【不得不感叹以前的科学家能想到这个方法】

2.用补码还不用考虑符号位的问题,统统加一起就行了

即可以同时考虑符号位和数值

3.浮点型在内存中的存储方式

如果采用上述整型的方法存储会造成精度丢失,因为二进制可以表示任何一个整数,但是不能精确的表示小数,如0.2怎么办是2的负几次方加负几次方?

因此在过去IEEEE754规定了浮点数在内存中存储,

表现为(-1)^S? *m? *2^E

浮点数的机器格式分三个部分,数符(表示正负)【即S控制】,阶码(表示通过科学计数小数点缩进的程度)【即2的多少次方,注意都是无符号型】,尾数(科学计数后小数点后的所有数)【即m】

首先 数符S ,? ?控制正负,0就是整数,1就是负数? (-1)的0次方或1次方。

然后是阶码E,阶码规定只有无符号数,那么这是如何做到的呢

标准中引入了中间值的概念,比如8位(8 bit)计算中间值就是127(2的8次方/2),11位就是1023

如果是2的-1次方,那么最后就是-1+127=126? (二进制)0.11转换成1.1*2^-1

阶码为正数也一样

如果取出的E是全0,这时真实值为-127,是一个非常小的数,因此尾数不会加上1,而是一直采用0.0...的方式取出,来表示无限接近于零甚至为零的数(符号取决于s)

如果如出的E是全1? ? 此时如果尾数为0 ,表示正负无穷(也是取决于s)

如果不是上面的特殊情况,那么先取出符号位,然后取出阶码还原,然后取出尾数还原,最后根据浮点数的读取规则把数读出来

最后是尾数m,因为采用科学技术法,最后尾数必然是处于1到2之间,所以我们把1的那一部分也去掉,最后取的时候加回来就行了,

如0.11转换成(1+0.1)*2^(-1)

4.大小端存储方式

1.高字节数据放在高地址,小字节放在低地址————小端存储

2.高字节数据放在低地址,小字节放在高地址————大端存储

?(鼠标实在太难画了)

对于超过一个字节的数据,他一定有放入顺序和拿出顺序,大端字节存储就是从高字节开始一个字节一个字节开始往后存,拿的时候原路返回即可

ps,如果是截断取的是低字节!

如 int的类型的变量? ?存储为11 22 33 44 转换成char拿到的是44,而不是11

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:05:10  更:2021-11-28 11:06:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:20:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码