-
数据是如何在内存中的储存
2021-02-09 10:59:21数据类型 首先介绍一下数据有哪些类型 1.char 字符型 2.short 短整形 3.int 整形 4.long 长整形 5.long long 更长的整形 6.float 单精度浮点型 7.double 双精度浮点型 注:不同的数据类型有不同的数据范围以及不同的...数据类型
首先介绍一下数据有哪些类型
1.char 字符型
2.short 短整形
3.int 整形
4.long 长整形
5.long long 更长的整形
6.float 单精度浮点型
7.double 双精度浮点型
注:不同的数据类型有不同的数据范围以及不同的存储方式整形家族包括char、short、int、long以及long long,它们有分为无符号型(unsigned)以及有符号型。
浮点家族有float和double。
整形的存储方式
首先我们要了解原码、反码以及补码的概念。
1.原码:将数据直接转换为二进制位就是原码
ps:二进制的最高位是符号位,1为负,0为正。
2.反码:符号位不变,其它位按位取反就得到了反码。
3.补码:反码+1。
ps:正数的原反补相同。整形是以补码存储在内存中。
why?
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理; 同
时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需
要额外的硬件电路。其次要介绍大小端
1.大端存储:数据的低位放在内存的高位,数据的高位放在地址的低位。
2.小端存储:数据的低位放在内存的低位,数据的高位放在地址的高位。
如何确定你的机器是大端还是小端呢?
将1放在int类型的变量i中,若是大端,i的内存中存放的便是0x00 00 00 01,而小端则是0x01 00 00 00。
char类型的指针解引用时只解引用一个字节,将i强制转换为char类型再进行解引用,如果是1,为小端,0为大端。#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> //判断大小端 //int check_sys() //{ // int i = 1; // return *((char*)&i);//char*解引用只访问一个字节 //} //int main() //{ // int n = check_sys(); // if (n) // { // printf("小端存储。\n"); // } // else // { // printf("大端存储。\n"); // } // return 0; //}
接下来看看一些有趣的代码
int main() { char a = -1; signed char b = -1; unsigned char c = -1; printf("a=%d,b=%d,c=%d", a, b, c); return 0; }
c打印出来的居然是255,是不是很神奇啊。
这里是因为将-1的补码也就是11111111放在unsigned char类型中,所以电脑认为它是一个以11111111为二进制的正数,十进制为255。int main() { char a[1000]; int i; for (i = 0; i<1000; i++) { a[i] = -1 - i; } printf("%d", strlen(a)); return 0; }
这个答案又是什么呢?
那么为什么是255呢?
首先简单介绍一下strlen这个函数:
strlen计算的是字符串的长度,遇到‘\0’停止。
所以我们要计算i==0之前的元素个数。
//11111111 -1
//11111110 -2
//11111101 -3
//…
//10000000 -128 这里默认为-128
//01111111 127
//…
//00000001 1
总共255个
//00000000 0
如果你清楚的知道char类型的范围,这个代码对你来说就是小菜一碟了。所以说我们学习一个数据类型时,不但要知道它再内存中的存储方式,还要知道它的范围。
浮点型数据的存储方式
首先我们来看看一段代码,你试着将这端代码的结果写出来。
int main() { int n = 9; //00000000000000000000000000001001 float *pFloat = (float *)&n; printf("n的值为:%d\n", n);//9 printf("*pF1oat的值为︰%f\n", *pFloat);//0 *pFloat = 9.0; printf("num的值为:%d\n", n);//很大 printf("*pF1oat的值为:%f\n", *pFloat); return 0;//9.000000 }
没想到会是这个结果吧,那到底是为什么呢?要了解这段代码,首先我们要知道浮点数在内存的存储方式。
任何二进制浮点数都可以写成(-1)^符号位 * 有效数字位 * 2^ 指数位。
float类型有32bit,有1bit为符号位,8bit为有效指数位,23bit为有效数字位,如图
1.符号位,0为正,1为负。
2.指数位,其为无符号整形,但我们知道当出现小数时,指数应该是负数,所以官方规定指数存入内存时会加一个中间值(127/1023)再转换为二进制,取出时与上述过程相反,但需注意以下两点:
1.全为1,即为2^(255-127)是一个巨大的数(±无穷大)
2.全为0,即2^(1-127)无限接近0。所以之前的代码中:
9的补码为00000000000000000000000000001001
以int型打印就是9,而以float型打印就是0
而9.0存储在内存中的形式为:
9.0 -> 1001.0 ->(-1)01.00123 -> s=0, M=1.001,E=3+127=130
0 10000010 001 0000 0000 0000 0000 0000
以整形打印就是以0 10000010 001 0000 0000 0000 0000 0000为二进制位转换而成的十进制位数字。double的存储方式相同,只不过double的指数位有11bit,有效数字位有52bit。
-
数据在内存中的储存
2020-12-12 21:57:01为a分配四个字节的空间,那如何储存? 对于整型来说:数据存放内存中实际存放的是补码。 原码:直接将二进制按照正负数的形式翻译成二进制就可以; 反码:将原码的符号位不变,其他位依次按位取反就可以得到; 补码...数据在内存中的储存(一)
一、整型在内存中的储存
我们之前讲过一个变量的创建是要在内存中开辟内存空间的。空间的大小是根据不同的类型而决定的。
我们知道int a=0;为a分配四个字节的空间,那如何储存?
对于整型来说:数据存放内存中实际存放的是补码。
原码:直接将二进制按照正负数的形式翻译成二进制就可以;
反码:将原码的符号位不变,其他位依次按位取反就可以得到;
补码:反码+1就得到。
正数的原、反、补码都相同。eg:内存中的储存:
Int a=-10; 内存中:(小端模式) 0X f6 ff ff ff
f f->1111 1111 f f->1111 1111 f f->1111 1111 f 6->1111 0110
11111111111111111111111111110110-补码
11111111111111111111111111110101-补码-1得到反码
10000000000000000000000000001010-符号位不变,其他位取反 得到原码
根据原码得 -10二、大小端
大端存储模式:数据的低位保存在内存的高地址中。
小端存储模式:数据的低位保存在内存的低地址中。
下面展示一些内联代码片
。设计一个小程序来判断当前机器的字节序:
#include<stdio.h> int check() { int i = 1; char *p = (char*)&i; return *p; } int main() { int ret = check(); if (ret == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; }
三、整形提升
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器的操作的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器长度。
因此,即使是两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU是难以直接实现两个8比特字节直接相加运算的。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int 或 unsigned int ,然后才能送入CPU去执行运算。Eg :char a,b,c;
a=b+c;
b和c的值被提升为普通整型,然后再执行加法运算。加法运算完成后,结果将被截断,然后再存储于a中。(要根据char的符号类型来提升,比如:unsigned char:高位补零;signed char:按符号位提升)练习
下面展示一些内联代码片
。#include<stdio.h> int main() { char a = -1; signed char b = -1; unsigned char c = -1; printf("a=%d,b=%d,c=%d", a, b, c); return 0; }
内存中int a的补码是:
11111111111111111111111111111111
char a的补码是(截断后):
11111111
打印整形printf(“a=%d”,a),因为char a是signed char a所以按符号位进行提升,提升后:
11111111111111111111111111111111unsigned char c=-1;
截断后:11111111
打印整形printf(“c=%d”,c),因为unsigned char a是无符号类型,所以提升时做无符号提升:采用高位补0的方式,提升后:
00000000000000000000000011111111
因为正数的原码、反码、补码相同,所以int c=255 -
Java千百问_06数据结构(016)_引用类型数组在内存中如何储存
2016-05-14 13:27:32点击进入_更多_Java千百问1、存放基本类型数组在内存中如何储存了解什么是数组看这里:java中的数组是什么 了解数组在内存中的储存看这里:java数组如何存储在内存中 java的数组中可以存放引用类型。 存放引用...1、存放基本类型数组在内存中如何储存
java的数组中可以存放引用类型。
存放引用类型的内存分布相比存放基本类型相对复杂。来看一段存储基本类型的程序:
了解什么是数组看这里:java中的数组是什么
了解数组在内存中的储存看这里:java数组如何存储在内存中public class TestPrimitiveArray { public static void main(String[] args) { //1.定义数组 int[] numbers; //2.分配内存空间 numbers = new int[4]; //3.为数组元素指定值 for(int i = 1;i <= numbers.length;i++) { numbers[i] = i ; } } }
内存分布如图:
从图中可看出数组元素直接存放在堆内存中,当操作数组元素时,实际上是操作基本类型的变量。
2、存放引用类型数组在内存中如何储存
先来再看一段存储引用类型数组的实例:
class Person { public int age; public String name; public void display() { System.out.println(name + "的年龄是: " + age); } } public class TestReferenceArray { public static void main(String[] args) { //1.定义数组 Person[] persons; //2.分配内存空间 persons = new Person[2]; //3.为数组元素指定值 Person p1 = new Person(); p1.age = 28; p1.name = "Miracle"; Person p2 = new Person(); p2.age = 30; p2.name = "Miracle He"; persons[0] = p1; persons[1] = p2; //输出元素的值 for(Person p : persons) { p.display(); } } }
元素为引用类型的数组,在内存中的存储与基本类型完全不一样。
此时数组元素存放引用,指向另一块内存,在其中存放有效的数据。如图:了解数组和普通对象的引用变量:数组和普通对象的引用变量有什么区别
-
VS2012 查看变量在内存中储存的数据
2019-10-22 12:56:20那么如何查看具体变量在哪块内存呢? 取地址啦~如下图: 在搜索栏用&取a的地址,然后回车就可以啦!(搜索栏是可以识别表达式的) 赋值操作完成后,对应地址的值就变化了哦! 另外再提,内存中...步骤依次如下:
设置断点——进入调试状态——点击上方调试选项卡——窗口——内存——内存1
Ps:一定要进入调试状态才可以哦!
然后,在下方就会有内存的窗口了!
最左边的是内存地址 右边是对应的内容
那么如何查看具体变量在哪块内存呢?
取地址啦~如下图:
在搜索栏用&取a的地址,然后回车就可以啦!(搜索栏是可以识别表达式的)
赋值操作完成后,对应地址的值就变化了哦!
另外再提,内存中的值是用16进制储存的 所以两个位一个单位,是一个字节
int 是4字节 即 a=0x0000 0001 细心的你可能会发现 内存里明明不是我写出来的0x0000 0001啊!其实这又牵扯到另外一个东西,数据的储存是大端还是小端
大端即高位存高地址,小端反之
没必要去特意地记
知道大端是正常人的认知顺序,小端是反人类的认知顺序就行了
我的PC也就是这反人类的小端红色部分的 01 00 00 00 应该从最右边开始读取
00 00 00 01注意!不是逆序读 是从右边开始 以一个字节位为单位读
像逆序 00 00 00 10 这是错误的读法
嘻嘻 大概就这些东西啦! -
Java千百问_06数据结构(018)_多维数组如何储存在内存中
2016-05-15 09:22:28点击进入_更多_Java千百问1、多维数组如何储存在内存中了解一维数组如何储存看这里:java数组如何存储在内存中从底层来看,数组元素可以存放引用类型,数组也是引用类型的一种。也就是说,在数组元素的内部还可以... -
float 在内存中的储存方式
2018-07-17 14:54:00文档链接:链接 float 在内存中的储存方式 ...64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是 float还是double在存储方式上都是遵从... -
如何深层次的理解js中数据的储存
2020-10-09 16:00:51会涉及到数据的存储。 数据的存储分为(栈和堆) 2 栈和堆 程序运行的时候,需要内存空间存放数据。一般来说,系统会划分出两种不同的内存空间:一种叫做堆(heap),另一种叫做栈(stack) 堆(heap)是没有结构的... -
Java--方法在执行过程中,在JVM中内存是如何分配的呢?内存是如何变化的呢?
2019-08-13 18:31:48方法内存分配 1.方法只定义,不调用,是不会执行的,并且在JVM中也不会给该方法分配运行所属的内存空间,只有在调用这个方法的时候,才会动态的给这个方法分配所属的内存空间...*数据结构反应的是数据的储存状态 *数... -
内存如何存放数据或指令
2014-12-14 09:54:55变量是指其值可以变化的量, 计算机中, 指令代码, 数据都储存于内存中.变量也需要存储在内存中.在计算机中, 每个变量都被分配了一块内存空间, 在这些空间里存储的就是变量的值. 变量之所以可以变化, 就是因为这个存储... -
已修改内存占用高_OpenResty 和 Nginx 的共享内存区是如何消耗物理内存的
2020-12-04 04:53:29OpenResty 和 Nginx 服务器通常会配置共享内存区,用于储存在所有工作进程之间共享的数据。例如,Nginx 标准模块ngx_http_limit_req和ngx_http_limit_conn使用共享内存区储存状态数据,以限制所有工作进程中的用户... -
python链表如何储存_「数据结构与算法之链表(Python)」(四)
2021-01-30 05:30:03什么是链表顺序表的储存分为一体式结构和分离式结构,但总的来说存储数据的内存是一块连续的单元,每次申请前都要预估所需要的内存空间大小。这样就不能随意的增加我们需要的数据了。链接就是为了解决这个问题。它的... -
内存位置访问无效_CPU是如何访问到内存的?
2020-12-16 18:00:56讨论的重点我们知道CPU有地址总线,数据总线和控制总线数据总线(Data Bus):在CPU...数据总线是用来传输数据的,假设内存上有一个篮球,这个篮球存放的地址是0x2345,CPU想拿到这个篮球的方法就是通过地址总线发送0x... -
11.1 js中级,数据类型、数据储存方式、作用域内存空间的区别以及例识别。...
2018-11-01 19:57:00一. 基本数据类型和引用数据类型的区别。 1.基本数据类型:基本数据类型就是简单的... 2)引用数据类型的赋值,是把引用的地址赋给他,在修改属性的时候,通过地址查找然后修改。 引用数据类型如何操作? ... -
LTE系统调试记录7:float&double在内存中的储存方式
2017-04-21 16:56:56转载地址:float在内存中的储存方式 float型数据在内存中的存储形式 ...64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是 -
浅析整数在计算机内存中的储存
2018-03-16 13:48:22我们都知道在计算机内部数据的存储和运算都采用二进制,是因为计算机是由很多晶体管组成的,而晶体管只有2种状态,恰好可以用二进制的0和1表示,并且采用二进制可以使得计算机内部的运算规则简单,稳定性高。... -
数据在内存中是怎样储存的
2021-02-05 08:39:18有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学... -
外存数据如何调入内存_内存条内存在电脑中起到的作用和功能,看看最简单的内存条知识吧...
2020-12-05 06:07:49随着现代科技不断的发展,很多电子产品的功能也越来越强大,例如电脑、电视、手机、学习机、故事机等,都有内存,可以储存很多的内容播放。尤其是电脑,内存是电脑硬件中必不可少的配件。那么,今天小编就和大家分享... -
android log 如何获取double类型后小数点的值_【C语言】数据储存 — 数据类型 —— 类型转换!...
2020-12-27 01:46:22程序说到底就是对数据的处理,所以首先要弄清楚需要处理哪些数据,计算机如何存储这些数据。C语言根据需要,抽象出了一些基本数据类型和衍生数据类型。这些可以满足大部分需求,更复杂的抽象数据类型亦可通过它们来... -
C程序的储存空间是如何分配?
2020-09-20 11:03:38可执行程序包括BSS段、数据段、代码段。 在类UNIX系统下可使用size命令查看可执行文件的段大小信息。...1.数据段存放已初始化的全局变量和静态变量,数据段属于静态内存分配。 2.BSS段(Block Started by Symbol)存 -
剖析数据在内存中的存储
2020-05-28 16:05:20在讨论数据在所开辟内存中是如何储存的之前要了解以下概念。 1、整形在内存中的存储 源码、反码、补码 计算机中的有符号数有三种表示方式,即原码、反码和补码;三种表示方法均有符号位和数值位两部分,符号位用... -
js的数据类型有哪些,值是如何存储的?
2020-07-01 11:19:52栈是有结构的,每个区块都是按照后进先出的方式次序存放,基本类型的数据相对是比较稳定的,占的内存也比较小,所有寻找速度比较快,如果基本类型复制的话,栈中重新开辟个新的内存空间来储存新复制的新值,所以两者... -
内存和外存的主要区别_五、如何选购内存
2021-01-31 07:37:52内存用于存储电脑运行时的临时数据,内存又称主存,是CPU能...内存应当是计算机内部(在主板上)的一些存储器,用来保存CPU运算的中间数据和计算结果,这些数据有时被保存在硬盘上,内存是暂时的存储正在运行的程... -
还需指正的“数据的储存”
2020-04-07 16:43:46我们知道这为a分配了4个字节的空间,那么是如何存储的呢? 接下来我们先来了解一下原码、反码、补码的概念 计算机的有符号数有三种表示方法,即原码、反码、补码。 三种方法均有符号位和数值位两部分,符号位都是用... -
如何恢复SD卡相机储存卡等USB设备数据丢失?
2018-05-24 14:59:31今天小编就为大家推荐一款专业的数据恢复软件——【得力数据恢复软件】推荐这款恢复软件有以下3个原因:1: UI简洁易懂,操作方便 即使是电脑基础不高的人也能轻松使用2: 功能强大 恢复彻底,小编试用过市面上其他... -
float数据类型在内存中的存储方式
2019-10-11 15:03:34我们可以通过以下C语言代码读取到内存中实际是如何储存这些数字的。 int main() { int d = 12345; char* p = &d; printf("%d : %x, %x, %x, %x\n", d, *(p + 3), *(p + 2), *(p + 1),... -
【C语言】数据储存 — 数据类型 —— 类型转换!
2019-12-12 16:14:22程序说到底就是对数据的处理,所以首先要弄清楚需要处理哪些数据,计算机如何存储这些数据。C语言根据需要,抽象出了一些基本数据类型和衍生数据类型。这些可以满足大部分需求,更复杂的抽象数据类型亦可通过它们来... -
内存条ar开头的如何看大小_固态硬盘与内存条,两者的作用谁更重要,你了解吗...
2020-12-12 12:15:44固态硬盘和内存条实际上区别很大,两者之间也没有太多的相似之处,固态硬盘是储存数据所用,而内存条虽然叫内存条,但是它不想固态硬盘那样能一直存储数据,它是用于临时存放CPU的运算数据的。固态硬盘与内存条是... -
itunes未能连接到iphone_iCloud内存不足,如何有选择性地备份iPhone数据到电脑端?...
2020-11-06 18:10:28说到备份iPhone 照片、文档、邮件等数据,大部分果粉常用到的肯定是iCloud,但是其免费空间只有 5 GB,要知道一期高清的综艺就占1G多,可想而知iCloud免费储存的数据是十分有限的,想要更大的iCloud储存空间就必须...
-
Samba 服务配置与管理
-
1 自动控制系统的基本概念.ppt
-
基于Qt的LibVLC开发教程
-
【爱码农】C#制作MDI文本编辑器
-
同济大学_工程地质_复习重点.pdf
-
中国矿业大学《电路理论》习题集(第五版含答案).pdf
-
习题2-4 求交错序列前N项和 (15 分)
-
PPT大神之路高清教程
-
2021-03-01
-
湖南大学《结构力学》历年考研试卷真题(含答案).pdf
-
NFS 网络文件系统
-
SAP License:2021年:传统ERP丧钟响起
-
自动化测试Python3+Selenium3+Unittest
-
大连理工《结构力学》历年考研试卷真题.pdf
-
2016年厦门大学《概率论与数理统计》期末考试试卷.pdf
-
零基础一小时极简以太坊智能合约开发环境搭建并开发部署
-
2021年 系统分析师 系列课
-
PYTHON 快速获取外网IP的方法
-
可以打印看下图像消息的具体信息,里面应该包含分辨率等等的,不一定是都用rqt_image_view查看,这个只能看到图像其他看不到。
-
2021-03-01