前言
最近在学习中涉及到计算机储存、传输数字和字符等操作,由于对字节、2
进制、10
进制、16
进制、ASCII码的概念以及它们之间的关系和转换理解的不够透彻,导致在通讯、MD5
消息摘要算法等时候出现问题,是因为数据转成计算机认识的01的这个环节出现问题。由于这个问题并不是那么容易发现,所以我也算是花了挺多时间才解决了这个问题,记录下解决过程,顺便也当复习一下计算机组成原理。
ASCII码
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。
ASCII 码一共规定了128
个字符(0000 0000
-0111 1111
)的编码,比如空格SPACE
是32(二进制0010 0000
),大写的字母A
是65(二进制0100 0001
)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位(低7位),最前面的一位(高1位)统一规定为0
(不要和数字的符号位搞混)。
当然除了ASCII码,还有UTF-8、GBK等。
字节
字节(Byte)普通计算机系统能读取和定位到最小信息单位,即我们通过计算机储存和传输数据的时候都是先把数据转成字节。
字节即Byte
,一个字节代表8
个比特(Bit),字节通常缩写为B,比特通常缩写为b。字节的大小是8
Bit,即字节的范围是0000 0000
- 1111 1111
,对于无符号型,它表示的十进制范围是[0,255],对于有符号型,高一位表示符号位,它表示的十进制范围是[-128,127]。
计算机若何储存数据
计算机只认识0
和1
(因为计算机只有高低电平两个状态),数据要想通过计算机储存或者传输,首先是要把数据转成计算机能认识的格式即01数据。
我们举个例子,以储存十进制数字28
和-28
为例,首先将十进制数转成二进制。
需要注意的是: 数字在计算机中储存的是补码,而字符是在计算机中储存的是字符对应的编码(不要和数字的补码搞混)。
数字
储存十进制数字28
和-28
为例,首先将十进制数转成二进制,高1
位为0
代表正数,为1
代表负数
28(10) = 0001 1100(2)(原码)
-28(10) = 1001 1