带着问题学习(内存)
- 高级编程语言中的数据类型表示的是什么?
- 32位环境中,指针的长度是多少位?
内存的物理结构
上图中展示的是一个内存条,它也是一个IC(集成电路)。
内存一般采用半导体存储单元,包括随机存储器(RAM)、只读存储器(ROM)以及高速缓存器(CACHE)。
参考于百度百科
上面是一张最简单的内存物理结构图,它有A0A9共100个地址引脚,也就是说能够寻址的范围是从0000000000到1111111111,共1024个地址值;而数据引脚是从D0D7共8个,也就是8bit,即1byte。所以上图展示的内存总大小为10248bit=1KB。所以我们得出内存的容量 = 寻址范围 * 一次性写入的大小。*
内存的逻辑结构
上图展示的是一个容量为1KB的内存逻辑结构图。从图上我们不难看出,内存中的每一个地址能够存储的数据是8bit,也就是一个byte,并且地址空间都是连续的。
不同数据类型在内存中的存储方式
我们常用的数据类型,比如char(1byte)和int(4byte),它们在内存中是怎样存储的呢?
对于char来说很简单,一个地址空间就能够存放下了,如下图所示,我们可以在地址为0001处存放一个char类型数据。但是对于int来说,该怎样存储呢?因为int类型的数据占用4byte,所以一个地址肯定存放不下,这时候,我们就将下面连续的4个地址空间都分配给int类型的数据变量(整个黄色区域都是代表int的作用域)。当然在取int类型的数据时候,也必须取4个地址的数据才正确,否则取出来的数据将是作物的数据。这就是计算机数据结构设计的一种存储方式。
常用的几种数据结构的优缺点
- 数组:它是分配一块连续的空间,每个元素占用的空间大小相同,所以可以通过下标的形式访问,使得访问速度非常快;但是如果想插入一个元素时,就需要移动大量的元素,空出一个元素空间,将要插入的数据填充到这个位置,同样,删除一个元素也是需要移动大量的元素,才能把这个元素删除掉。所以数组的增删速度很慢,但是它的随机访问速度非常快。
- 栈:数组的变形,主要用于数据记录,起到回溯的作用,它的特点是先进后出(FILO)。
- 链表:链表中的每一个元素不一定是连续的,如果想要查询某个元素的值,需要从链表头(对于单向链表)挨个的往后一个一个的遍历,直到遍历到这个元素所在位置时为止,但是链表的插入和删除速度是非常快的,因为它不需要移动其它的元素。所以链表的随机访问速度比较慢,但是它的插入和删除速度非常快。
程序是如何运行的 试卷一
- CPU中不含有以下选项中的:C
A:运算器
B:寄存器
C:内存
D:时钟 - CPU中负责计时的部件是:B
A:程序计数器
B:时钟
C:控制器
D:靠人来计时 - 对于汇编以下说法正确的是:B
A:汇编要编译成机器码
B:汇编是助记符,和机器码一一对应
C:汇编是给CPU看的
D:编译器编译出来的是汇编 - 以下哪个寄存器名是错的?D
A:累加寄存器
B:程序计数器
C:标志寄存器
D:控制寄存器 - 以下哪个说法是错误的?C(控制器是用来控制基本操作的,比如去哪里读、去哪里写、内存地址是多少等操作)
A:计算机能够执行分支是因为标志寄存器
B:计算机能够执行循环是因为程序计数器
C:控制器控制程序的分支及循环运行
D:标志寄存器负责保存计算后结果的状态 - 请写出二进制,八进制,十进制,十六进制(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 |
请使用公式写出二进制数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假设一个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假设一个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假设二进制数(16位)0101 1111 0000 1111左移3位,结果是:
二进制:1111 1000 0111 1000
十进制:-1928
十六进制:0xF878假设二进制数(16位)0101 1111 0000 0000逻辑右移3位,结果是:
二进制:0000 1011 1110 0000
十进制:3040
十六进制:0xBE0假设二进制数(16位)0101 1111 0000 0000算术右移3位,结果是:
二进制:0000 1011 1110 0000
十进制:3040
十六进制:0xBE0假设二进制数(16位)1101 1111 0000 0000算术右移3位,结果是:
二进制:1111 1011 1110 0000
十进制:-1056
十六进制:0xFBE0请问一下代码输出的结果是 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内存为什么有地址,我们是通过什么计算出内存的大小的?
答:因为内存芯片中有地址引脚,通过引脚找到内存地址,进而找到这个地址里面存储的值,一个内存地址中存储的数据大小和内存读取指针有关,所以:
内存的大小=寻址范围*一次读写大小。一次读写大写一般是8bit。编程时读取和写入内存速度最快的数据结构是:A
A:数组
B:栈
C:队列
D:链表请说明一下上一题中几种数据结构的优势。
数组:读写速度非常快;
栈:便于数据记录和回溯;
队列:便于数据的顺序操作;
链表:便于元素的插入和删除。程序是在内存中执行的:A
A:对
B:错所有的数据都是一直(包括关机时)存储在:C
A:内存
B:CPU
C:硬盘
D:我脑子里