存储单元

两个栈共享连续存储单元

。_饼干妹妹 提交于 2020-02-03 20:47:35
两个栈共享连续存储空间:它主要利用了栈底位置不变,栈顶位置动态变化的特性。 所以在定义栈顶指针时,需要定义两个栈顶指针。 双栈类型定义如下: typedef struct { datatype data [ MAXSIZE ] ; int top [ 2 ] ; /* 栈顶指针 */ } DqStack ; 两个共享栈的压栈算法: int push ( STACK * s , ElemType x , int k ) { //将x元素压入到以s为栈空间的第k个栈中 if ( s -> top [ 0 ] + 1 == s -> top [ 1 ] ) { printf ( "\n stack is full!" ) ; return 0 ; } if ( k == 0 ) { s -> top [ 0 ] ++ ; s -> data [ s -> top [ 0 ] ] = x ; } else { s -> top [ 1 ] -- ; s -> data [ s -> top [ 1 ] ] = x ; } return 1 ; } 两个共享栈的出栈算法: int pop ( STACK * s , int k , ElemType * x ) //将以s为栈空间的第k个栈顶元素取出 { if ( ( k == 0 ) && ( s -> top [ 0 ] == - 1 )

《操作系统真象还原》读书笔记 第3章

扶醉桌前 提交于 2020-01-30 03:20:16
0x1 地址、section、vstart 0x1.1 什么是地址 地址只是数字,描述各种符号在源程序中的位置,它是源代码文件中各符号偏移文件开头的距离。由于指令和变量所占内存大小不同,故他们相对于文件开头偏移量参差不齐。源码文件中各符号地址是由编译器来规划的。 编译器的工作就是给各符号编址。编译器根据所在硬件平台特性,将源代码中的每一个符号(指令和数据)都按照硬件平台的特性分配空间,在不考虑对齐情况下,这些符号都在空间上彼此相邻,连续分布,它们在程序中距第一个符号的距离便是他们载程序中的地址。(ps:跟文件文件偏移一个意思) 本质上,程序中各种数据结构的访问,就是通过“该数据结构的起始地址+该数据结构所占内存大小决定的”来实现的。这就解释了为什么要给出变量类型,因为变量类型规定了变量所占内存的大小,每种类型都有其对应的内存容量。 程序中定义的任何一个变量,在编译后的可执行文件中都会占据一席之地。此变量在文件中的位置是编译器来安排的。编译器无论怎么安排程序中的数据,必然有一个先后顺序,而占据第一位的数据,其地址便是整个程序的起始地址,在它后面的数据依次排开。 0x1.2 什么是section 编译器提供的关键字Section只是为了让程序员在逻辑上将程序划分成几个部分,因为它是伪指令,CPU不知道这是什么东西。一般section的应用场所是根据不同的属性人为地将程序划分几部分

java基础-操作符-自增自减操作符

青春壹個敷衍的年華 提交于 2020-01-11 05:47:21
自增自减操作符的使用及理解参考: http://hinylover.space/2017/07/30/java-i-self-increament/ 转载自:https://blog.csdn.net/xialei199023/article/details/76383013 在几乎所有的命令式编程语言中,必然都会有i++和++i这种语法。在编程启蒙教材《C语言程序设计》一书中,也专门解释了这两条语句的区别。有些语言中i++和++i既可以作为左值又可以作为右值,笔者专门测试了一下,在Java语言中,这两条语句都只能作为右值,而不能作为左值。同时,它们都可以作为独立的一条指令执行。 int i = 0; int j1 = i++; // 正确 int j2 = ++i; // 正确 i++; // 正确 ++i; // 正确 i++ = 5; // 编译不通过 ++i = 5; // 编译不通过 关于i++和++i的区别,稍微有经验的程序员都或多或少都是了解的,为了文章的完整性,本文也通过实例来简单地解释一下。 { int i = 1; int j1 = i++; System.out.println("j1=" + j1); // 输出 j1=1 System.out.println("i=" + i); // 输出 i=2 } { int i = 1; int j2 = ++i;

Java参数传递

和自甴很熟 提交于 2020-01-11 00:32:13
Java语言的参数传递只有「按值传递」 如果形参是基本数据类型,那么实参向形参传递参数时,就是直接传递值,把实参的值复制给形参。 如果方法的形参是对象,那么实参向形参传递参数时,也是把值给形参,这个值是实参在栈内存的值,也就是引用对象在堆内存中的地址。   基本数据类型都是保存在栈内存中,引用对象在栈内存中保存的是其地址。方法的参数传递是传递值(变量在栈内存当中的值)。 1、基本数据类型的参数 TransferTest1.java 1 public class TransferTest1 { 2 public static void main(String[] args) { 3 int num = 1; 4 System.out.println("before num = " + num); 5 changeNum(num); 6 System.out.println("after num = " + num); 7 } 8 public static void changeNum(int x) { 9 x = 2; 10 } 11 } 运行结果: 传递过程示意如下: num作为参数传递给changeNum()方法时,是将内存空间中num所指向的那个存储单元中存放的值1传递给了changeNum()方法中的x变量,而这个x变量也在内存空间中分配了一个存储单元,这个时候,就

计算机组成原理(期末篇)

蹲街弑〆低调 提交于 2020-01-08 22:25:51
1、计算机系统的组成 计算机系统由硬件和软件两部分组成 硬件,是指计算机的实体部分,由看得见摸得着的各种电子元器件组成,如主机、外设 软件,是指具有各类特殊功能的程序,通常放在计算机的主存或辅存中 软件分为系统软件和操作软件 系统软件(程序软件),用来管理整个计算机系统,监听服务,调度系统资源,包括:标准程序库、语言处理程序、操作系统、服务程序、数据库管理系统、网路软件等 应用软件(应用程序),用户根据任务需要所编制的各种程序 2、冯诺依曼机器的主要特点? 1)计算机由运算器、存储器、控制器、输入设备和输出设备五大部分组成; 2)指令和数据存储在存储器中,并可以按地址访问; 3)指令和数据均以二进制表示; 4)指令由操作码和地址码构成,操作码指明操作的性质,地址码表示操作数在存储器中的位置; 5)指令在存储器内按顺序存放,通常按自动的顺序取出执行; 6)机器以运算器为中心,I/O设备与存储器交换数据也要通过运算器。(后来以存储器为中心) 3、区分存储单元、存储字、存储字长、存储体、机器字长、存储字长 存储单元:存储一个存储字并具有特定存储地址的存储单位; 存储字:一个存储单元中存放的所有的二进制数据,按照某个地址访问某个存储单元获取的二进制数据。 存储字长:存储字中二进制数据的位数,即按照某个地址访问某个存储单元获取的二进制数据的位数; 存储体:由多个存储单元构成的存储器件。

关于地址线位数与存储单元个数的问题

本秂侑毒 提交于 2020-01-02 10:23:02
存储单元、存储字长、存储容量的定义 1. 存储单元 是CPU访问存储器的基本单位。 一般以8位二进制作为一个存储单元,即一个字节。 2. 存储字 :是指存放在一个存储单元中的二进制代码组合。 3. 存储字长 :一个存储单元存储一串二进制代码(存储字),这串二进制代码的位数称为存储字长。 存储字长可以是8位、16位、32位等。 再结合存储单元的定义,存储字长一般是8位。 4. 地址线 一次确定一个存储单元,地址线上值可能取的所有组合确定了存储单元的个数。 所以, 存储单元的个数= 2 地 址 线 的 条 数 2^{地址线的条数} 2 地 址 线 的 条 数 。 5. 存储容量 是指存储器可以容纳的二进制信息量,用存储器中存储地址寄存器MAR的编址数与存储字位数的乘积表示。 存 储 容 量 = 地 址 寄 存 器 M A R 的 编 址 数 < 存 储 单 元 个 数 > ∗ 存 储 字 位 数 < 存 储 字 长 > 存储容量=地址寄存器MAR的编址数<存储单元个数>*存储字位数<存储字长> 存 储 容 量 = 地 址 寄 存 器 M A R 的 编 址 数 < 存 储 单 元 个 数 > ∗ 存 储 字 位 数 < 存 储 字 长 > ----计算出来的是所能存储的二进制代码的总位数(不是字节) 6.将存储容量转换成字节:$$存储容量(字节)=地址寄存器MAR的编址数*存储字位数

像素点+分辨率+帧缓存器

孤人 提交于 2019-12-15 00:50:26
像素+分辨率+帧缓冲器[对话框篇] 一、像素点 定义: 像素点是指图形显示在屏幕上时候,按当前的图形显示分辨率所能提供的最小元素点 举例: 如下图所示,截取一张电脑屏幕图片 如下图所示,放大后可以看见图片是由小的四方形组成,每一个四方形就是一个像素点 二、分辨率 屏幕分辨率就是屏幕上能显示的像素个数. 例如上面截取的电脑屏幕图片是大小是1920*1080(因为是截取整个电脑屏幕,因此也是屏幕分辨率的大小), 指的是每一行有1920个像素组成,每一列由1080个像素组成. 三、帧缓冲器 定义: 它是屏幕所显示画面的一个直接映象,又称为位映射图(Bit Map)或光栅。帧缓存的每一存储单元对应屏幕上的一个像素,整个帧缓存对应一帧图像。 存储单元 帧缓冲器的存储单元个数至少与显示器能显示的像素总数相同,且存储单元一一对应于可寻址的屏幕像素位置; 例如屏幕像素个数1920 1080,则对应显存的1920 1080个存储单位; 帧缓冲器每一个存储单元的位长决定了一幅画面上能同时显示的不同灰度的数目或颜色的种类 1)如果存储单元位长是1bit,则表示2种颜色的黑白图,显示效果如下 2)如果存储单元位长是4Bit,则是16种颜色(2的4次方)灰度图,显示效果如下 3)我们常用存储单元位长是是24bit,也就是RGB每一个用一个字节表示,显示效果如下 来源: CSDN 作者: 热带宇林1 链接:

时序逻辑设计基础

孤街醉人 提交于 2019-12-05 04:59:23
1、电平触发的存储单元叫锁存器(Latch); 2、边沿触发的存储单元叫触发器(trigger / Flip flop ),电路输出对输入值敏感,但只有同步信号边沿到达时输出发生变化; 来源: https://www.cnblogs.com/lizhiqing/p/11908104.html

位域结构体简介

余生颓废 提交于 2019-12-04 16:44:01
最近实习接触到一个新的知识点,C/C++的位域结构体。 以下开始摘抄自: here 位段(bit-field)是以位为单位来定义结构体(或联合体)中的成员变量所占的空间。含有位段的结构体(联合体)称为位段结构。采用位段结构既能够节省空间,又方便于操作。 位段的定义格式为: 1 type [var]: digits 其中type只能为int,unsigned int,signed int三种类型(int型能不能表示负数视编译器而定,比如VC中int就默认是signed int,能够表示负数)。位段名称var是可选参数,即可以省略。digits表示该位段所占的二进制位数。 举个例子,你可以这样定义一个位域结构体: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // sizeof(A): 4 struct A { uint32_t a: 12; uint32_t b: 10; uint32_t c: 10; }; // sizeof(B): 12 struct B { uint32_t a; uint32_t b; uint32_t c; }; uint32_t 实际上是 unsigned int 的别名,并且指定了用4个字节存储int类型的数据,而 1byte = 8bits, 4个字节共计32bits,结构体A使用了位域的方式,指定了每个成员所占用的bit数

理解计算机内存、数据类型本质、连续存储

我怕爱的太早我们不能终老 提交于 2019-12-03 21:31:54
要学习数据结构与算法,与数据的类型密不可分,要知道数据在计算机中是如何存取的,需知道计算机中基本的存储单元是字节,一个字节是八个位。在计算机的内存连续的存储空间是由一些基本的存储单元组成的,一个字节(八个位)作为一个地址标识。存数据的时候需要多个存储单元放在一起表示。 如:0000 0000 这就是一个基本的存储单元。 如下:在计算机的内存中有四个基本存储单元,也就是四个字节。 对于32位机器 基本整型int 占 4个字节 如上图:一个整数类型的数据占4个基本储存单元(4个字节,也就是32个位)。 如:int 1; 在计算机中二进制存储,看到的是0000 0001, 其实实际是 00000000 00000000 00000000 00000001 一共4个字节,32个位来标识。 如:char 'a'; 在计算机中 只占一个存储空间,一个字节。 如果:声明,上图四个存储单元是 整型 int ,计算机会将这四个存储单元 看做整型来对待。 如果:声明,上图四个存储单元是 字符 char , 计算机会将这四个存储单元看做 4个char。 总结应该知道两点: 1.不同的类型占用存储单元个数不同。 2.计算机怎么对待内存中存储的这些二进制数据呢?根据不同的数据类型做对应的处理。 如果是一个 顺序列表 如下存储: Li [7,2100,390] 内存地址 00x1 对应 第一个元素 7