34、计算机编码与数据存储知识解析

计算机编码与数据存储知识解析

1. ASCII字符集

最初,美国信息交换标准代码(ASCII)规定了通过电话线一次传输一个字节的代码编号的含义。这些数据常存储在纸带,用于控制像电传打字机这类简单设备间的通信。它不仅要传输字符,还要管理通信链路,控制电传打字机的行为,如回车(Carriage Return, CR)、换行(Line Feed, LF)或跳转到下一个8的倍数的列(制表符,HT)。ASCII表的前32个值被用作执行这些控制任务的不可打印字符。现在,大部分控制字符已不再使用,但我们仍用‘\r’、‘\n’和‘\t’来控制窗口或文档中文本的显示。

原始的ASCII表将数值32 - 126分配给一组特定的可打印字符,这足以表示数字符号、大小写字母和常见标点符号。然而,随着需要表示更多国际字符,这个数值范围不够用了,于是又分配了接下来的128个值,但对于这第二部分映射并没有统一的标准。

当国际社会需要表示更广泛的字符集时,就需要用多个字节来编码符号。于是定义了Unicode字符集,并达成了关于如何高效传输这些代码的国际协议,即UTF - 8(UCS转换格式)。

另外还有两个与ASCII相关的历史情况:
- 数值0 - 127只占用一个字节数据的低7位,第8位在传输时用作错误检测位。两台机器传输时需要就传输的奇偶性达成一致。偶数奇偶校验意味着字节中设置的位数总是偶数,第8位会被设置或重置以确保这一点。如果一个字节中设置的位数为奇数,系统就知道数据已损坏。
- ASCII 127是另一个用于编辑纸带时的非打印控制字符。由于值127的所有位都被设置,纸带上的孔表示1,如果操作员在输入消息时出错,他们会在穿孔机中倒回纸带并按下DEL键,在整个字节上打孔,从而擦除错误字符。

以下是MATLAB语言使用的前128个ASCII值表:
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
| 0 | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | HT | LF | VT | FF | CR | SO | SI |
| 16 | DLE | DC1 | DC2 | DC3 | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS | RS | US |
| 32 | | ! | ” | # | $ | % | & | ’ | ( | ) | * | + | , | - | . | / |
| 48 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 64 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 80 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
| 96 | ‘ | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
| 112 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL |

2. 计算机内部数字表示

如今,大多数计算机使用两种不同的技术来存储数字值:整数存储和浮点存储。整数存储能精确表示所存储数字的值,而浮点存储只保证一定位数的精度。整数和浮点形式存储的值都有上限,但浮点存储能存储比整数存储大得多的数字。

默认情况下,MATLAB将数字存储设置为双精度浮点表示。不过,像将图像读入MATLAB这样的操作会以更紧凑的无符号整数形式呈现大量数据。

2.1 整数

整数在计算机内存中由不同大小的数据位块表示。内存以8位为增量分配,通常称为字节,所以整数存储也以相同的大小增量出现。对于给定大小的数据位,其值有两种表示方式:有符号或无符号。通常,我们期望一个数字有正负值,当位数较多时,这似乎影响不大。但当用较少的位数存储值时,其中一位必须用于表示数字的正负,因此可存储的数字范围会减少1位,即缩小为原来的一半。

例如,对于8位存储,有符号的最大值是127,无符号的最大值是255。如果这些存储容量不够,可以使用16位、32位或64位字来存储数字,相应地,最大存储大小也会增加。

2.2 浮点数

浮点数使用IEEE 754标准以单精度(32位)或双精度(64位)存储。存储格式包括尾数和指数,内部表示方式与整数存储类似。尾数的固定大小决定了每种存储类型的固定精度。单精度浮点数据类型提供7位有效十进制数字,双精度浮点数据类型提供15位有效十进制数字。

以下是MATLAB中最常用存储类型的参数表:
| MATLAB名称 | 大小(字节) | 最小值 | 最大值 | C名称 |
| — | — | — | — | — |
| uint8 | 1 | 0 | 255 | unsigned char |
| int8 | 1 | -128 | 127 | char |
| uint16 | 2 | 0 | 65,536 | unsigned short |
| int16 | 2 | -32,768 | 32,767 | short |
| uint32 | 4 | 0 | 4,294,967,295 | unsigned int |
| int32 | 4 | -2,147,483,648 | 2,147,483,647 | int |
| float | 4 | ~ -3.4E + 38 | ~ 3.4E + 38 | float |
| double | 8 | ~ -1.7E + 308 | ~ 1.7E + 308 | Double |

3. 各章节问答解析

以下是不同章节的一些问答情况:

3.1 章节1
  • 判断题
    • 部分陈述为真,如“对于计算机有用,必须有硬件来在处理器和其他设备间传输数据”;部分为假,如“通常认为Charles Babbage设计了第一台计算机,但有人认为公元前500年使用的计数板(算盘由此衍生)也可算作计算机设计”。
  • 填空题
    • 涉及语法、词汇、冯·诺依曼架构、编译、缓存、应用程序、逻辑、BIOS等概念。
3.2 章节2
  • 判断题
    • 例如“编写正确的算法可以泛化以解决一系列子问题”为假;“函数式和面向对象程序都需要过程组件才能在处理器上运行”为真。
  • 填空题
    • 包括过程式、类型化、命令历史窗口、防止赋值结果在命令窗口显示、命令模式和编辑模式等内容。
3.3 章节3
  • 判断题
    • “同质集合必须由相同类型的数据组成”为真;“列向量返回列数”为假。
  • 填空题
    • 涉及数值、向量位置、矩阵、元素级操作、最大值计算、最大维度等。
3.4 章节4
  • 判断题
    • “注释为绿色,控制执行的关键字为蓝色”为真;“MATLAB编辑器插入缩进只是为了向读者澄清脚本中的控制流”为假。
  • 填空题
    • 包含关键命令字、布尔值、continue语句、input函数、入口控制循环操作等。
3.5 章节5
  • 判断题
    • “函数可以访问所有系统数据和函数,也可以直接访问全局数据”为真;“MATLAB通过m文件的名称调用用户定义的函数,而忽略其中指定的名称”为假。
  • 填空题
    • 有函数文件名、过程抽象、形式参数和实际参数、局部作用域等。
3.6 章节6
  • 判断题
    • “类型转换改变计算机看待数据的方式但不改变数据本身”为真;“MATLAB会自动将字符串转换为其ASCII值”为假。
  • 填空题
    • 涉及特殊内部表示、字符、数字、标点符号、转换函数、格式控制字符串等。
3.7 章节7
  • 判断题
    • “为数值数组定义的集体操作不能应用于单元数组或结构体”为真;“移除结构体的字段和值会返回一个新的结构体”为假。
  • 填空题
    • 包括逐个提取和替换、类检查、单元数组赋值、结构体创建等。
3.8 章节8
  • 判断题
    • “硬盘上的字符存储可能是随机分布的,但读写磁盘的软件会将字符序列化”为真;“保存变量名和当前值,而不是生成数据的程序”为假。
  • 填空题
    • 有值和组织、文件追加、数值数组填充、文件读取函数等。
3.9 章节9
  • 判断题
    • “如果函数或其调用的任何函数抛出异常,直到包含try … catch块的函数的所有帧都会从栈中弹出”为假;“尾递归函数在‘进入’时进行数学计算”为假。
  • 填空题
    • 涉及栈操作、运行时错误、错误函数、测试和设置、递归函数计算等。
3.10 章节10
  • 判断题
    • “所有元素可能都不满足用于确定是否更改它们的测试”为真;“过滤可能会从集合中移除元素,但剩余元素不会改变”为真。
  • 填空题
    • 包括数值匹配、最大值、过滤、折叠、查找元素等。
3.11 章节11
  • 判断题
    • “如果省略x向量,独立参数默认为1:N;如果省略str,使用实心蓝线”为真;“增强函数必须跟随绘图函数才能应用于特定数据图”为假。
  • 填空题
    • 有新图形、图形窗口、图例、等间距、子图等。
3.12 章节12
  • 判断题
    • “即使最原始的数据成员也会封装其数据并控制对数据执行的操作”为真;“矩阵运算在一个或两个矩阵为标量时也适用”为真。
  • 填空题
    • 涉及矩阵运算、非奇异方阵、单位矩阵、独立变量和未知变量等。
3.13 章节13
  • 判断题
    • “0表示没有光,会显示黑屏”为真;“imread(…)可以适应读取任何支持的图像文件,根据不同图像样式返回不同结果”为真。
  • 填空题
    • 包括像素、图像维度、图形窗口、图像操作、转置等。
3.14 章节14
  • 判断题
    • “移除样本会提高频率”为假;“录音的位数对未训练的耳朵没有显著影响”为假。
  • 填空题
    • 有频率、快速傅里叶变换和逆变换、声音能量和频率带等。
3.15 章节15
  • 判断题
    • “线性插值在数据点超出范围时返回NaN,但不会报错”为真;“所有曲线拟合只是提供多项式的系数,你可以插入任何自变量的值”为假。
  • 填空题
    • 包含多项式拟合和求值、曲线下面积、切线斜率、累积求和、关键点等。
3.16 章节16
  • 判断题
    • “先将复合表达式简化为一系列O(…)值,然后相加并移除增长较慢的项”为真;“线性搜索算法的复杂度是O(N),但二分搜索是O(log N)”为真。
  • 填空题
    • 有时间复杂度O(N²)、O(log N)、插入排序、冒泡排序和快速排序等。

通过这些问答,我们可以更深入地理解计算机编程和数据处理中的各种概念和操作。在实际编程中,我们需要根据具体情况正确运用这些知识,避免常见的错误和误解。例如,在处理数据存储时,要根据数据的特点选择合适的存储类型;在编写算法时,要考虑算法的复杂度和效率等。

4. 计算机知识的综合应用与实践要点

在实际的计算机编程和数据处理过程中,我们需要将上述各个方面的知识进行综合运用,以实现各种复杂的任务。以下是一些综合应用的要点和实践建议。

4.1 数据存储与处理的选择

在处理不同类型的数据时,合理选择数据存储方式至关重要。如果数据需要精确表示,如整数类型的数据,且范围在相应整数存储类型的范围内,应优先考虑使用整数存储。例如,在处理图像像素值时,由于像素值通常是无符号的整数,使用无符号整数存储可以更高效地利用内存。

graph LR
    A[数据类型判断] -->|整数且范围合适| B[整数存储]
    A -->|需要高精度小数| C[浮点存储]
    B -->|8位足够| D[8位整数]
    B -->|需要更大范围| E[16/32/64位整数]
    C -->|单精度足够| F[单精度浮点]
    C -->|需要更高精度| G[双精度浮点]

如果数据包含小数部分,并且对精度有一定要求,那么浮点存储是更好的选择。但要注意浮点存储的精度限制,避免在需要高精度计算的场景中出现误差累积。例如,在金融计算中,由于涉及到货币金额,通常需要较高的精度,此时应使用双精度浮点存储。

4.2 字符编码的应用

在处理文本数据时,字符编码起着关键作用。如果处理的是英文文本,ASCII编码通常就足够了。但在处理多语言文本时,就需要使用Unicode字符集和UTF - 8编码。例如,在开发一个国际化的网站时,为了支持不同语言的用户输入和显示,必须使用UTF - 8编码来确保所有字符都能正确显示。

在MATLAB中,当处理字符串时,要注意字符串与ASCII值之间的转换。例如,将字符串转换为ASCII值可以使用内置函数,反之亦然。以下是一个简单的示例:

% 将字符串转换为ASCII值
str = 'Hello';
ascii_values = double(str);
disp(ascii_values);

% 将ASCII值转换为字符串
new_str = char(ascii_values);
disp(new_str);
4.3 算法复杂度的考虑

在设计和选择算法时,算法复杂度是一个重要的考量因素。对于大规模数据的处理,应尽量选择复杂度较低的算法。例如,在搜索操作中,如果数据是有序的,二分搜索算法(复杂度为O(log N))比线性搜索算法(复杂度为O(N))更高效。

以下是一个简单的二分搜索算法的MATLAB实现:

function index = binary_search(arr, target)
    left = 1;
    right = length(arr);
    while left <= right
        mid = floor((left + right) / 2);
        if arr(mid) == target
            index = mid;
            return;
        elseif arr(mid) < target
            left = mid + 1;
        else
            right = mid - 1;
        end
    end
    index = -1; % 未找到目标值
end

% 测试二分搜索算法
arr = [1, 3, 5, 7, 9];
target = 5;
index = binary_search(arr, target);
disp(index);
4.4 数组操作的技巧

在处理数组时,要熟练掌握各种数组操作方法。例如,在进行数组索引时,要注意索引的范围和逻辑。使用逻辑索引可以方便地筛选出符合条件的元素。以下是一个使用逻辑索引筛选数组元素的示例:

% 创建一个数组
arr = [1, 2, 3, 4, 5, 6];
% 创建逻辑索引
logical_index = arr > 3;
% 使用逻辑索引筛选元素
new_arr = arr(logical_index);
disp(new_arr);

同时,在进行数组运算时,要注意数组的维度和元素类型的匹配。例如,在进行矩阵乘法时,两个矩阵的维度必须满足乘法规则。

5. 总结与展望

计算机知识涵盖了数据存储、字符编码、算法设计等多个方面,这些知识相互关联,共同构成了计算机编程和数据处理的基础。在实际应用中,我们需要根据具体的任务需求,综合运用这些知识,选择合适的方法和技术。

未来,随着计算机技术的不断发展,数据量将不断增大,对数据处理的效率和精度要求也会越来越高。因此,我们需要不断学习和掌握新的知识和技术,如大数据处理、人工智能等,以适应不断变化的需求。同时,对基础知识的深入理解和熟练运用仍然是至关重要的,只有打好基础,才能更好地应对未来的挑战。

在日常的学习和实践中,我们可以通过不断地编写代码、解决实际问题来加深对这些知识的理解和掌握。同时,多参考优秀的代码示例和开源项目,学习他人的经验和技巧,也是提高自己编程能力的有效途径。

总之,计算机知识是一个广阔而深奥的领域,我们需要不断探索和学习,才能在这个领域中取得更好的成绩。希望本文所介绍的内容能够对读者有所帮助,引导大家更好地理解和应用计算机知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值