美文网首页
03_内存(计算机科学)

03_内存(计算机科学)

作者: yishurensheng | 来源:发表于2017-11-20 00:45 被阅读0次

带着问题学习(内存)

  • 高级编程语言中的数据类型表示的是什么?
  • 32位环境中,指针的长度是多少位?

内存的物理结构

image.png
        上图中展示的是一个内存条,它也是一个IC(集成电路)。
        内存一般采用半导体存储单元,包括随机存储器(RAM)、只读存储器(ROM)以及高速缓存器(CACHE)。
参考于百度百科 memory physical structure.png
        上面是一张最简单的内存物理结构图,它有A0A9共100个地址引脚,也就是说能够寻址的范围是从0000000000到1111111111,共1024个地址值;而数据引脚是从D0D7共8个,也就是8bit,即1byte。所以上图展示的内存总大小为10248bit=1KB。所以我们得出内存的容量 = 寻址范围 * 一次性写入的大小。*

内存的逻辑结构

memory logical structure.png

        上图展示的是一个容量为1KB的内存逻辑结构图。从图上我们不难看出,内存中的每一个地址能够存储的数据是8bit,也就是一个byte,并且地址空间都是连续的。

不同数据类型在内存中的存储方式

        我们常用的数据类型,比如char(1byte)和int(4byte),它们在内存中是怎样存储的呢?
        对于char来说很简单,一个地址空间就能够存放下了,如下图所示,我们可以在地址为0001处存放一个char类型数据。但是对于int来说,该怎样存储呢?因为int类型的数据占用4byte,所以一个地址肯定存放不下,这时候,我们就将下面连续的4个地址空间都分配给int类型的数据变量(整个黄色区域都是代表int的作用域)。当然在取int类型的数据时候,也必须取4个地址的数据才正确,否则取出来的数据将是作物的数据。这就是计算机数据结构设计的一种存储方式。


data type.png

常用的几种数据结构的优缺点

  • 数组:它是分配一块连续的空间,每个元素占用的空间大小相同,所以可以通过下标的形式访问,使得访问速度非常快;但是如果想插入一个元素时,就需要移动大量的元素,空出一个元素空间,将要插入的数据填充到这个位置,同样,删除一个元素也是需要移动大量的元素,才能把这个元素删除掉。所以数组的增删速度很慢,但是它的随机访问速度非常快。
  • 栈:数组的变形,主要用于数据记录,起到回溯的作用,它的特点是先进后出(FILO)。
  • 链表:链表中的每一个元素不一定是连续的,如果想要查询某个元素的值,需要从链表头(对于单向链表)挨个的往后一个一个的遍历,直到遍历到这个元素所在位置时为止,但是链表的插入和删除速度是非常快的,因为它不需要移动其它的元素。所以链表的随机访问速度比较慢,但是它的插入和删除速度非常快。

程序是如何运行的 试卷一

  1. CPU中不含有以下选项中的:C
    A:运算器
    B:寄存器
    C:内存
    D:时钟
  2. CPU中负责计时的部件是:B
    A:程序计数器
    B:时钟
    C:控制器
    D:靠人来计时
  3. 对于汇编以下说法正确的是:B
    A:汇编要编译成机器码
    B:汇编是助记符,和机器码一一对应
    C:汇编是给CPU看的
    D:编译器编译出来的是汇编
  4. 以下哪个寄存器名是错的?D
    A:累加寄存器
    B:程序计数器
    C:标志寄存器
    D:控制寄存器
  5. 以下哪个说法是错误的?C(控制器是用来控制基本操作的,比如去哪里读、去哪里写、内存地址是多少等操作)
    A:计算机能够执行分支是因为标志寄存器
    B:计算机能够执行循环是因为程序计数器
    C:控制器控制程序的分支及循环运行
    D:标志寄存器负责保存计算后结果的状态
  6. 请写出二进制,八进制,十进制,十六进制(9之后使用字母顺序)
二进制 八进制 十进制 十六进制
00000000 00 0 0x00
00000001 01 1 0x01
00000010 02 2 0x02
00000011 03 3 0x03
00000100 04 4 0x04
00000101 05 5 0x05
00000110 06 6 0x06
00000111 07 7 0x07
00001000 010 8 0x08
00001001 011 9 0x09
00001010 012 10 0x0A
00001011 013 11 0x0B
00001100 014 12 0x0C
00001101 015 13 0x0D
00001110 016 14 0x0E
00001111 017 15 0x0F
00010000 020 16 0x10
00010001 021 17 0x11
00010010 022 18 0x12
00010011 023 19 0x13
00010100 024 20 0x14
00010101 025 21 0x15
00010110 026 22 0x16
00010111 027 23 0x17
00011000 030 24 0x18
00011001 031 25 0x19
00011010 032 26 0x1A
00011011 033 27 0x1B
00011100 034 28 0x1C
00011101 035 29 0x1D
00011110 036 30 0x1E
00011111 037 31 0x1F
  1. 请使用公式写出二进制数0 1110 0001 1000 0011 1000对应的十进制,需要解题步骤:
    答:首先将上面的二进制转换为十六进制,如下所示:
    0 1110 0001 1000 0011 1000
    0 E 1 8 3 8
    =816^0 + 316^1 + 816^2 + 116^3 + 14*16^4
    =8 + 48 + 2048 + 4096 + 917504
    =923704

  2. 假设一个32位带符号(有负数)的二进制数0111 0010 1110 1111 0011 1111 0000 1100,请写出对应的十进制数。
    答:首先将上面的二进制转换为十六进制,如下所示:
    0111 0010 1110 1111 0011 1111 0000 1100
    7 2 E F 3 F 0 C
    =1216^0 + 0 + 1516^2 + 316^3 + F16^4 + E16^5 + 216^6 + 7*16^7
    =12 + 0 + 3840 + 12288 + 983040 + 14680064 + 33554432 + 1879048192
    =1928281868

  3. 假设一个32位带符号(有负数)的二进制数1111 0010 0010 1111 0011 0110 0000 1100,请写出对应的十进制数。
    答:因为最高位是1,所以是负数,先减1,然后取反,得到二进制,转换成十进制,再加上负号就是计算的结果。
    1111 0010 0010 1111 0011 0110 0000 1100
    减1,如下所示:
    1111 0010 0010 1111 0011 0110 0000 1011
    取反,如下所示:
    -(0000 1101 1101 0000 1100 1001 1111 0100)
    对应的十六进制为:
    -(0 D D 0 C 9 F 4)
    =-(416^0 + 1516^1 + 916^2 + 1216^3 + 0 + 1316^5 + 1316^6)
    =-(4 + 240 + 2304 + 49152 + 0 + 13631488 + 218103808)
    =-231786996

  4. 假设二进制数(16位)0101 1111 0000 1111左移3位,结果是:
    二进制:1111 1000 0111 1000
    十进制:-1928
    十六进制:0xF878

  5. 假设二进制数(16位)0101 1111 0000 0000逻辑右移3位,结果是:
    二进制:0000 1011 1110 0000
    十进制:3040
    十六进制:0xBE0

  6. 假设二进制数(16位)0101 1111 0000 0000算术右移3位,结果是:
    二进制:0000 1011 1110 0000
    十进制:3040
    十六进制:0xBE0

  7. 假设二进制数(16位)1101 1111 0000 0000算术右移3位,结果是:
    二进制:1111 1011 1110 0000
    十进制:-1056
    十六进制:0xFBE0

  8. 请问一下代码输出的结果是 C
    Int main()
    {
    float sum = 0;
    for(int i=0; i<100; i++)
    {
    Sum += 0.1;
    }
    printf(“%f\r\n”, sum);
    }
    A:10.0000000
    B:10.0000002
    C:不知道(因为浮点数计算肯定是存在偏差的,具体偏差多少,可能与CPU的不同而不同,所以结果是不确定的,也就是未定义的操作!即使是double类型变量,也不能够精确的表示所有的小数,只有一些特殊的小数才能精确表示,比如0.5/0.25/0.125等,如果想精确运算,只能用整数来表示。)
    D:1.0000000

  9. 内存为什么有地址,我们是通过什么计算出内存的大小的?
    答:因为内存芯片中有地址引脚,通过引脚找到内存地址,进而找到这个地址里面存储的值,一个内存地址中存储的数据大小和内存读取指针有关,所以:
    内存的大小=寻址范围*一次读写大小。一次读写大写一般是8bit。

  10. 编程时读取和写入内存速度最快的数据结构是:A
    A:数组
    B:栈
    C:队列
    D:链表

  11. 请说明一下上一题中几种数据结构的优势。
    数组:读写速度非常快;
    栈:便于数据记录和回溯;
    队列:便于数据的顺序操作;
    链表:便于元素的插入和删除。

  12. 程序是在内存中执行的:A
    A:对
    B:错

  13. 所有的数据都是一直(包括关机时)存储在:C
    A:内存
    B:CPU
    C:硬盘
    D:我脑子里

相关文章

  • 03_内存(计算机科学)

    带着问题学习(内存) 高级编程语言中的数据类型表示的是什么? 32位环境中,指针的长度是多少位? 内存的物理结构 ...

  • 一些笔试题

    java内存相关 内存泄漏 在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并...

  • 说说 JavaScript 中内存泄漏的几种情况

    一、是什么 内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存 ...

  • 10| 早期的编程方式

    之前演示的,默认程序在内存了,但事实上 程序需要加载进内存。 表示魔法 是计算机科学。 早期的机器编程 给机器编程...

  • Java 的 CAS原理

    简介 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。它将内存位置...

  • Java 垃圾收集技术

    前言 在计算机科学中,垃圾回收(GC: garbage collection)是内存自动管理的一种方式,它并不是同...

  • java内存模型

    一、现代计算机物理内存模型 Java内存模型规定了JVM如何基于计算机内存工作。JVM就是一个完整的计算机模型因此...

  • ARM汇编的内存操作详解

    内存操作-读取内存: 跟内存相关的指令无非是把内存中读取到计算机里面或者把计算机的内容读取到内存里面。存储器和计算...

  • 1.介绍C语言

    1.计算机的工作原理: 计算机由 cpu + 内存 + 硬盘 + 外围设备组成。 内存(随机存取内存ARM)是存...

  • Java内存模型与硬件内存模型

    硬件内存模型 不管是什么内存模型,最终还是运行在计算机硬件上的,所以我们有必要了解计算机硬件内存架构 现代计算机一...

网友评论

      本文标题:03_内存(计算机科学)

      本文链接:https://www.haomeiwen.com/subject/cejmvxtx.html