计算机内部是如何表示数字和文字的呢?

前言:

     我们所处的世界充满了各种各样的字符,我们使用它们,用自己定义的方式来表示,交流。那么计算机内部是怎么样表示这些字符的呢?这个时候你满脑子都是电脑屏幕上的0 1 0 1对吧。是的,没错,由于硬件的原因,计算机使用01来表示我们世界的字符。但字符的种类如此之多,这其中的范式又是什么呢?

     在我们走进01世界之前,我们先看看当下我们使用的字符编码,这其中不乏大家熟知的ascall码、utf-8等等。

字符编码
编码提出时间字符集大小解释
ASCALL1961年128个字符(最初为8位,最高位为校验位)可以表示数字、英文字符和一些字符

(ANSI)MBCS

由于ASCALL字符有限,每个国家语言不同,所以对ASCALL进行扩充,产生MBCS对于不同国家来说,基本实现所有字符的覆盖不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码,又称为"MBCS(Muilti-Bytes Character Set,多字节字符集)

GB2312

是ANSI的一种,针对我们国家发布的,也叫国标码6763个常用汉字和682个全角的非汉字字符组成采用94行94列的区位码进行编码
GBKGB 2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。总计23940 个码位,共收入21886个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号883 个有些汉字用五笔和拼音都打不出来,如:溙(五笔IDWI),须调出GBK字符集才能打出这个字

Big5

为统一繁体字符集编码,1984年,台湾五大厂商宏碁、神通、佳佳、零壹以及大众一同制定了一种繁体中文编码方案,因其来源被称为五大码,英文写作Big5,后来按英文翻译回汉字后,普遍被称为大五码

大五码是一种繁体中文汉字字符集,其中繁体汉字13053个,808个标点符号、希腊字母及特殊符号

目前,Big5编码在台湾、香港、澳门及其他海外华人中普遍使用,成为了繁体中文编码的事实标准。

Unicode

世界上存在着多种编码
方式,在ANSi编码下,同一个编码值,在不同的编码体系里代表着不同的。为了统一就诞生了Unicode
Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号Unicode固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。
UTF-8为了提高Unicode的编码效率,于是就出现了UTF-8编码。UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。和Unicode一样字符集

对Unicode的优化,可以包含世界上所有字符,字母占1个字节,汉字占3个字节;

UTF-8 是在互联网上使用最广的一种 Unicode 的实现方式。

UTF-8 是一种变长的编码方式。它可以使用 1-6 个字节表示一个符号,根据不同的符号而变化字节长度

Base64

有的电子邮件系统(比如国外信箱)不支持非英文字母(比如汉字)传输。
这是历史原因造成的,因为一个英文字母使用ASCII编码来存储,占存储器的1个字节(8位),实际上只用了7位2进制来存储,第一位并没有使用,设置为0,所以,这样的系统认为凡是第一位是1的字节都是错误的。而有的编码方案(比如GB2312)不但使用多个字节编码一个字符,并且第一位经常是1,于是邮件系统就把1换成0,这样收到邮件的人就会发现邮件乱码。
英文中文字符都可以为了能让邮件系统正常的收发信件,就需要把由其他编码存储的符号转换成ASCII码来传输。比如,在一端发送GB2312编码->根据Base64规则->转换成ASCII码,接收端收到ASCII码->根据Base64规则->还原到GB2312编码

     这些编码集都是外面平时使用的,不信你可以打开记事本,点击另存为的时候就可以选择字符集,当然就有上面我们提到的ANSI。而我们做javaee或者网页的时候,大都也采用utf-8,看了上面的介绍我们心里应该大致知道是为什么了吧。所以,乱码并不可怕,只要编码和解码的字符集一致就好,绝对不会出问题。

 

一、思维导图

     我们可以看看关于我们世界所使用的文字的思维导入,接下来所展示的数字和文字表示方式会根据这个来进行。

 

二、谈谈数据的表示方式

     大部人是知道计算机内部以01来存储我们的数据,也知道进制的转换,这里就根据上面的思维导图来简单说说我们的数据表示吧。

(1)数值类型

     首先,大家最新认识的当然是十进制的数据(在没有学计算机之前,其它的进制数大都是在初高中数学里面知道的,但都不熟悉)。对于十进制数,我们在熟悉不过了,我们可以用二进制,八进制,十六进制来表示。例如十进制27就可以表示为十六进制的1B,二进制的0001 1010。那么聪明的你可能会问我,负数是怎么表示的呀?当然,我们用十进制是很好表示负数的,但是对计算机来说,却是一件头疼的事情。所以CS(Computer scientist)们就想出将二进制能够表示的数用一半的数表示正数,另一半的数表示负数的形式。例如8位二进制数,0~127这128个数字就表示正数,而128~255这128个数字就表示负数,但是约定它们表示-128~-1。所以就有了课堂上老师说计算机内部拥有符号位的说法,其本质就是这个。如果想要了解更过关于二进制补码的,可以跳转到我这篇博客:进制转换小技巧之让你重新认识二进制补码(大师,我悟了)!!!。所以对于数值我们就说清楚了对吧。

     当然没有啦,因为我们小学所学的,除了整数,还有小数呢,这里小数又分为定点数和浮点数。但是你会问我,什么?小学不就是小数吗?上面的定点数和浮点数当然是我们计算机有关的定义啦。所谓的定点数就是约定机器中所有数据的小数点位置是固定不变的。由于约定在固定位置,小数点就不再使用记号“.”来表示了。所以定点数就是我们上面所说的纯整数还有纯小数。我们只需要最高位表示符号位,后面为尾数即可。

     如果数X表示的是纯小数,那么小数点位于Xn和Xn-1之间;如果数X表示的是纯整数,那么小数点位于最低位X0的右边。

--------->

     对于浮点数来说:把数的范围和精度分别表示的方法,相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点数表示法。

     任意的一个十进制数N可以写成N = 10^E.M;同样,任意二进制N可以写成N = 2^e.M。其中M称为浮点数的尾数,是一个纯小数。e是比例因子,称为指数,表示为整数,也称为阶码。而阶符合数符当然就是符号位啦。所以我们现在已经知道了定点数和浮点数在机器内的表达方式了。那么我们小时候所学的也并非只有数学,还有语文,还有各种各样的符号,它们是怎么在计算机中表示呢?

(2)字符和字符串

     对于我们所学的ABCD,显然需要另一种方式来表达,于是我们就有了ASCALL码,美国人将英语字符和其它符号专门定义了一个统一的标准,用专门的数字对应符号,例如a的ASCALL码就是97,它对应的大写的A的ascall码就是65,为什么我会知道,你可能相差32,那是因为在二进制表达的时候大小写的差值就在于第5位二进制的符号相异。而表示字符串,我们既可以用ascall码,也可以用我们可以理解的方法(但这些方法大都不实用,因为计算机内部无法表示)。

     由于ascall码能够表示的字符有限,所以后来我们就有了Unicode,万国码,超级齐全,之后的utf-8和utf-16也是以此为基准在计算机内部表示。

 

三、谈谈汉字的表示方式

     那我们国家的汉字如何表示存储的呢?

     存储汉字有很多种方法对吧,我们国家采用的数字编码其实就是国标区位码,也就是将国家标准局公布的6763个两级汉字分为94个区,每个区分94位,实际上就是一个二维的表格。例如“中”字就是第54区48位,区位码为5448。而它的机器内吗无非就是将5448转换为进制数(因为这里的5448是十进制数)。例如我们转换为16进制数为36 30,注意,这里54 48是两个数字,所以转换是分别转换。然后将它加上A0A0H,就得到它的机器内码的表示:D6D0。也就是说:汉字内码 = 区位码 + 0XA0X0H。

     为什么是这样呢?那是因为,一个汉字要两个字节,为了让计算机识别出左边和右边一同联合表示一个汉字,最高位就为1,所以我们这么加也就是让最高位都为1啦。

 

四、展望:有没有更好的表示呢?

     现在几乎所有的人类语言和字符都可以用计算机来表示了,我们做项目一件很重要的事情也就是统一字符编码,让编码和解码的字符一致,才不会出现乱码的情况。当然最常用的也就是utf-8啦。那么有没有比这更好更快的表达呢?让计算机更加的便捷呢?就看你们啦~

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

threecat.up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值