精华内容
下载资源
问答
  • 数据类型 首先介绍一下数据有哪些类型 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所以按符号位进行提升,提升后:
    11111111111111111111111111111111

    unsigned char c=-1;
    截断后:11111111
    打印整形printf(“c=%d”,c),因为unsigned char a是无符号类型,所以提升时做无符号提升:采用高位补0的方式,提升后:
    00000000000000000000000011111111
    因为正数的原码、反码、补码相同,所以int c=255

    展开全文
  • 点击进入_更多_Java千百问1、存放基本类型数组在内存如何储存了解什么数组看这里:java中的数组什么 了解数组在内存中的储存看这里: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();
            }
        }
    }

    元素为引用类型的数组,在内存中的存储与基本类型完全不一样
    此时数组元素存放引用,指向另一块内存,在其中存放有效的数据。如图:

    这里写图片描述

    了解数组和普通对象的引用变量:数组和普通对象的引用变量有什么区别

    展开全文
  • 那么如何查看具体变量在哪块内存呢? 取地址啦~如下图: 在搜索栏用&取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千百问1、多维数组如何储存内存中了解一维数组如何储存看这里:java数组如何存储在内存中从底层来看,数组元素可以存放引用类型,数组也引用类型的一种。也就是说,在数组元素的内部还可以...
  • 文档链接:链接 float 在内存中的储存方式 ...64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是   float还是double在存储方式上都是遵从...
  • 会涉及到数据的存储。 数据的存储分为(栈和堆) 2 栈和堆 程序运行的时候,需要内存空间存放数据。一般来说,系统会划分出两种不同的内存空间:一种叫做堆(heap),另一种叫做栈(stack) 堆(heap)没有结构的...
  • 方法内存分配 1.方法只定义,不调用,不会执行的,并且在JVM中也不会给该方法分配运行所属的内存空间,只有在调用这个方法的时候,才会动态的给这个方法分配所属的内存空间...*数据结构反应的是数据的储存状态 *数...
  • 内存如何存放数据或指令

    千次阅读 2014-12-14 09:54:55
    变量指其值可以变化的量, 计算机中, 指令代码, 数据储存内存中.变量也需要存储在内存中.在计算机中, 每个变量都被分配了一块内存空间, 在这些空间里存储的就是变量的值. 变量之所以可以变化, 就是因为这个存储...
  • OpenResty 和 Nginx 服务器通常会配置共享内存区,用于储存在所有工作进程之间共享的数据。例如,Nginx 标准模块ngx_http_limit_req和ngx_http_limit_conn使用共享内存储存状态数据,以限制所有工作进程中的用户...
  • 什么是链表顺序表的储存分为一体式结构和分离式结构,但总的来说存储数据的内存是一块连续的单元,每次申请前都要预估所需要的内存空间大小。这样就不能随意的增加我们需要的数据了。链接就是为了解决这个问题。它的...
  • 讨论的重点我们知道CPU有地址总线,数据总线和控制总线数据总线(Data Bus):在CPU...数据总线用来传输数据的,假设内存上有一个篮球,这个篮球存放的地址0x2345,CPU想拿到这个篮球的方法就是通过地址总线发送0x...
  • 一. 基本数据类型和引用数据类型的区别。  1.基本数据类型:基本数据类型就是简单的... 2)引用数据类型的赋值,把引用的地址赋给他,在修改属性的时候,通过地址查找然后修改。  引用数据类型如何操作?  ...
  • 转载地址:float在内存中的储存方式   float型数据内存中的存储形式 ...64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是
  • 我们都知道在计算机内部数据的存储和运算都采用二进制,因为计算机由很多晶体管组成的,而晶体管只有2种状态,恰好可以用二进制的0和1表示,并且采用二进制可以使得计算机内部的运算规则简单,稳定性高。...
  • 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也必不可少的KaTeX数学...
  • 随着现代科技不断的发展,很多电子产品的功能也越来越强大,例如电脑、电视、手机、学习机、故事机等,都有内存,可以储存很多的内容播放。尤其是电脑,内存是电脑硬件中必不可少的配件。那么,今天小编就和大家分享...
  • 程序说到底就是对数据的处理,所以首先要弄清楚需要处理哪些数据,计算机如何存储这些数据。C语言根据需要,抽象出了一些基本数据类型和衍生数据类型。这些可以满足大部分需求,更复杂的抽象数据类型亦可通过它们来...
  • 可执行程序包括BSS段、数据段、代码段。 在类UNIX系统下可使用size命令查看可执行文件的段大小信息。...1.数据段存放已初始化的全局变量和静态变量,数据段属于静态内存分配。 2.BSS段(Block Started by Symbol)存
  • 在讨论数据在所开辟内存是如何储存的之前要了解以下概念。 1、整形在内存中的存储 源码、反码、补码 计算机中的有符号数有三种表示方式,即原码、反码和补码;三种表示方法均有符号位和数值位两部分,符号位用...
  • 有结构的,每个区块都按照后进先出的方式次序存放,基本类型的数据相对比较稳定的,占的内存也比较小,所有寻找速度比较快,如果基本类型复制的话,栈中重新开辟个新的内存空间来储存新复制的新值,所以两者...
  • 内存用于存储电脑运行时的临时数据,内存又称主存,是CPU能...内存应当是计算机内部(在主板上)的一些存储器,用来保存CPU运算的中间数据和计算结果,这些数据有时被保存在硬盘上,内存是暂时的存储正在运行的程...
  • 我们知道这为a分配了4个字节的空间,那么是如何存储的呢? 接下来我们先来了解一下原码、反码、补码的概念 计算机的有符号数有三种表示方法,即原码、反码、补码。 三种方法均有符号位和数值位两部分,符号位都是用...
  • 今天小编就为大家推荐一款专业的数据恢复软件——【得力数据恢复软件】推荐这款恢复软件有以下3个原因:1: UI简洁易懂,操作方便 即使电脑基础不高的人也能轻松使用2: 功能强大 恢复彻底,小编试用过市面上其他...
  • 我们可以通过以下C语言代码读取到内存中实际是如何储存这些数字的。 int main() { int d = 12345; char* p = &d; printf("%d : %x, %x, %x, %x\n", d, *(p + 3), *(p + 2), *(p + 1),...
  • 程序说到底就是对数据的处理,所以首先要弄清楚需要处理哪些数据,计算机如何存储这些数据。C语言根据需要,抽象出了一些基本数据类型和衍生数据类型。这些可以满足大部分需求,更复杂的抽象数据类型亦可通过它们来...
  • 固态硬盘和内存条实际上区别很大,两者之间也没有太多的相似之处,固态硬盘是储存数据所用,而内存条虽然叫内存条,但是它不想固态硬盘那样能一直存储数据,它用于临时存放CPU的运算数据的。固态硬盘与内存...
  • 说到备份iPhone 照片、文档、邮件等数据,大部分果粉常用到的肯定iCloud,但是其免费空间只有 5 GB,要知道一期高清的综艺就占1G多,可想而知iCloud免费储存数据是十分有限的,想要更大的iCloud储存空间就必须...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 328
精华内容 131
关键字:

内存是如何储存数据的