计算机中数据的本质

声明:我的文章完全是原创,转载需要注明出处,并且本人享有该文章的所有知识产权。

经过上篇文章,我们了解了软件和硬件,那么今天我们来讨论一下真实的计算机中是如何存储数据的。

首先我们讨论一下二进制,二进制说来很简单,无非就是1和0。由于我们的计算机是电子产品,里面有的只有电路结构,也就是我们所有的理论都需要建立在物理层面上,那么我们1和0究竟是怎么得到的呢?

在之前讲过,灯泡的开关,我们可以用1代表开,用0带表关。但是真实的情况是这样的吗?

其实在真正的应用中,我们主要使用的是两类逻辑0和1的表示方式(TTL,RS-232)

TTL常用标准:

如果电源电压为5V,那么低于低于0.8V为0,3.6V(2.4V~5V)为1

如果电源电压为3.3V,那么低于0.8V为0,3.4V(2~2.4V)为1

RS-232常用标准:

+3V~+15V表示0,-3V~-15V表示1

这就是逻辑电路里的1和0的表示方式。有了这个基础,我们再来看一下在我们系统中是如何表示各种符号的。

由于我们一个电信号只能更精确的表示两种状态,因此,如果只使用1位二进制数来表示我们遇到的各种符号(文字,标点等)是不现实的,那么计算机是怎么表示这些信息的呢?

由于摩尔发明了电报,他们只需要27个符号就能表达出所有常用的字母数字和字符,因此一开始是使用了7个二进制位来表达字母和数字以及标点符号--ASCII

ASCII控制字符

二进制 十进制 十六进制 缩写 可以显示的表示法 名称/意义
0000 0000 0 00 NUL 空字符(Null)
0000 0001 1 01 SOH 标题开始
0000 0010 2 02 STX 本文开始
0000 0011 3 03 ETX 本文结束
0000 0100 4 04 EOT 传输结束
0000 0101 5 05 ENQ 请求
0000 0110 6 06 ACK 确认回应
0000 0111 7 07 BEL 响铃
0000 1000 8 08 BS 退格
0000 1001 9 09 HT 水平定位符号
0000 1010 10 0A LF 换行键
0000 1011 11 0B VT 垂直定位符号
0000 1100 12 0C FF 换页键
0000 1101 13 0D CR 归位键
0000 1110 14 0E SO 取消变换(Shift out)
0000 1111 15 0F SI 启用变换(Shift in)
0001 0000 16 10 DLE 跳出数据通讯
0001 0001 17 11 DC1 设备控制一(XON 启用软件速度控制)
0001 0010 18 12 DC2 设备控制二
0001 0011 19 13 DC3 设备控制三(XOFF 停用软件速度控制)
0001 0100 20 14 DC4 设备控制四
0001 0101 21 15 NAK 确认失败回应
0001 0110 22 16 SYN 同步用暂停
0001 0111 23 17 ETB 区块传输结束
0001 1000 24 18 CAN 取消
0001 1001 25 19 EM 连接介质中断
0001 1010 26 1A SUB 替换
0001 1011 27 1B ESC 跳出
0001 1100 28 1C FS 文件分割符
0001 1101 29 1D GS 组群分隔符
0001 1110 30 1E RS 记录分隔符
0001 1111 31 1F US 单元分隔符
0111 1111 127 7F DEL 删除

ASCII可显示字符

二进制 十进制 十六进制 图形
0010 0000 32 20 (空格)(␠)
0010 0001 33 21 !
0010 0010 34 22 "
0010 0011 35 23 #
0010 0100 36 24 $
0010 0101 37 25  %
0010 0110 38 26 &
0010 0111 39 27 '
0010 1000 40 28 (
0010 1001 41 29 )
0010 1010 42 2A *
0010 1011 43 2B +
0010 1100 44 2C ,
0010 1101 45 2D -
0010 1110 46 2E .
0010 1111 47 2F /
0011 0000 48 30 0
0011 0001 49 31 1
0011 0010 50 32 2
0011 0011 51 33 3
0011 0100 52 34 4
0011 0101 53 35 5
0011 0110 54 36 6
0011 0111 55 37 7
0011 1000 56 38 8
0011 1001 57 39 9
0011 1010 58 3A :
0011 1011 59 3B ;
0011 1100 60 3C <
0011 1101 61 3D =
0011 1110 62 3E >
0011 1111 63 3F ?
 
二进制 十进制 十六进制 图形
0100 0000 64 40 @
0100 0001 65 41 A
0100 0010 66 42 B
0100 0011 67 43 C
0100 0100 68 44 D
0100 0101 69 45 E
0100 0110 70 46 F
0100 0111 71 47 G
0100 1000 72 48 H
0100 1001 73 49 I
0100 1010 74 4A J
0100 1011 75 4B K
0100 1100 76 4C L
0100 1101 77 4D M
0100 1110 78 4E N
0100 1111 79 4F O
0101 0000 80 50 P
0101 0001 81 51 Q
0101 0010 82 52 R
0101 0011 83 53 S
0101 0100 84 54 T
0101 0101 85 55 U
0101 0110 86 56 V
0101 0111 87 57 W
0101 1000 88 58 X
0101 1001 89 59 Y
0101 1010 90 5A Z
0101 1011 91 5B [
0101 1100 92 5C \
0101 1101 93 5D ]
0101 1110 94 5E ^
0101 1111 95 5F _
 
二进制 十进制 十六进制 图形
0110 0000 96 60 `
0110 0001 97 61 a
0110 0010 98 62 b
0110 0011 99 63 c
0110 0100 100 64 d
0110 0101 101 65 e
0110 0110 102 66 f
0110 0111 103 67 g
0110 1000 104 68 h
0110 1001 105 69 i
0110 1010 106 6A j
0110 1011 107 6B k
0110 1100 108 6C l
0110 1101 109 6D m
0110 1110 110 6E n
0110 1111 111 6F o
0111 0000 112 70 p
0111 0001 113 71 q
0111 0010 114 72 r
0111 0011 115 73 s
0111 0100 116 74 t
0111 0101 117 75 u
0111 0110 118 76 v
0111 0111 119 77 w
0111 1000 120 78 x
0111 1001 121 79 y
0111 1010 122 7A z
0111 1011 123 7B {
0111 1100 124 7C |
0111 1101 125 7D }
0111 1110 126 7E ~

但是随着人们对信息的积累,发现还另外需要一些符号来表达相关的信息,因此IBM建议使用8位来表示所有的字母、数字、标点符号--ASCII扩展码。使用8位二进制来表示符号的方法一直延用至今。但是由于当时只是建议使用8位来表示信息,但是最后一位没有确定对应的符号,所以各个厂商根据自己的情况,定义了不同的符号,因此就有了不同的规范,因此有可能同一个扩展的ASCII代表的符号不同。这个比较少用,所以这里不再介绍。

前面花了很多时间在介绍ASCII,这是为何?因为我们现在的电子计算机,基本都遵守着这个约定来存取数据。用8个二进制位代表一个字符,IBM给这8个二进制位取了一个名字,叫做字节byte。同时一个二进制我们通常叫做位(bit)。

可能有朋友会想,在ASCII里没有中文啊,都是字母 数字 符号,那么中文是怎么存取的呢?

实际上我们的中文等象形文字都是使用两个字节(2byte)的方式进行数据的存取。我们把以2个字节的方式进行数据存取的方式叫做UNICODE编码。UNICODE编码有很多实现方案,导致相同的二进制数在不同的编码格式中代表了不同的含义,所以如果需要还原出原来的文字信息,就必须使用特定的编码方式才行,这里就像谍战片中的破敌方电报内容一样,好不容易截获了敌人的电报信息,还得靠密码本才能还原电报的内容。

常见的UNICODE编码有:UTF8,GB2312,GBK,ISO8859-1;

了解这个知识很重要,在以后编程过程中,经常会遇到编码问题导致屏幕显示的数据乱码。

当然,正如大家看到的那样,用0和1表示ASCII码的时候比较长,使用十进制显示的时候换算的时候比较麻烦,所以我们通常使用十六进制对计算机中的二进制信息进行显示。

二进制:由0~1组成,遇2进1.

十进制:由0~9组成,遇9进1

十六进制:由0~F组成,遇F进1(0~9,A~F)

由二进制转十六进制的方法:

把8位数据拆分为4位一组:0011 0000

以8、4、2、1原则进行计算

   8 4 2 1
x 0 0 1 1
---------
  0+0+2+1 = 3

由于4位二进制最大只能表示15,所以,我们使用十六进制简化8个二进制位的长度。因此0011 0000用十六进制表示为30,为了防止与十进制发生歧义,十六进制数通常在前面加上0x表示,因此最终结果为0x30。

作业:

1、如下ASCII表示的字母是什么

0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x6c 0x64 0x21

2、使用UTF8的编码方式在存储中取得的信息如下,请帮忙还原一下该数据的值

0x00 0x48 0x00 0x65 0x00 0x6c 0x00 0x6c 0x00 0x6f 0x00 0x20 0x00 0x57 0x00 0x6f 0x00 0x72 0x00 0x6c 0x00 0x64 0x00 0x21

3、总结一下题1和题2的特点,并将ASCII与UNICODE建立联系

4、使用UTF8的编码方式编码“计算机软硬结合”,并写出来(通过查表的方式得到十六进制,再将十六进制转换为二进制)。

对应的作业请参考“百度”,比如UTF8的编码表

猜你喜欢

转载自www.cnblogs.com/delsav/p/9236509.html