字节与编码
一直有个疑问,就是字节,位这些单位和我们用计算机工作,娱乐,上网有什么关系?为什么一个字节是8位bit?随着自己查找些资料,似乎有些明白了。
为什么一个字节是8位?
这个是取决与CPU设计的,因为0,1只能表示2种状态,所以仅仅是0,1做计算时并不能做复杂计算,所以需要将0,1进行组合,一个0或1代表一个位,一般的计算机都被设计成8位一组(数据)也就是1byte,这样由8个0或者1就可以表述很多信息了,此时你内心应该设计一下自己的组合。
举一个不恰当的玩笑例子:
4位0和1,我们来设计一下能表述的信息,0000表示饭店,0001表示拿筷子,0010表示拿碗,0011表示夹菜,0100表示洗完。。。。。。
输入 0000,0001,0010,0011,0100对应的处理流程
发现饭店,拿筷子,拿碗,夹菜,洗完。。。。。。
是不是很无聊。
计算机用8位为计算最小单位,也就是最小 0000 0000,最大 1111 1111,这就是1byte的范围了。十进制就是0~255或-128~127(为什么是127?是因为0占一个位了,所以约定是将正数少一位给0了)。
自认为是讲明白了位的意思,那就再讲讲byte与字符吧。
什么ABCD,abcd,1234,计算机能理解吗?扯淡,它很单纯只认识0和1,你给它abcd它认识才怪?那怎么办?难道买台计算机需要不停的输入0和1么?瞬间感觉计算机好辣鸡,这时候伟大的科学家们(我儿时梦想)就发明了编码,就像我上面例子哪有,输入拿筷子就是0001,输入拿碗就是0010,这个过程就叫编码。
因为发明计算机的人是会英文的,而且相对简单只有26个字母,所以最初的编码用一个byte就能标记好了,就比如这样
上面截图就是 ANCII编码,我们可以发现它是8位描述一个字符的,也就是1byte。是不是觉得原来如此哦,计算机总算是明白我们的abcd了。当然这里有编码转换操作,这一般都是我们写的程序来做的(脸皮厚,你写的?)将我们理解的转换成计算机理解的0和1。
汉字怎么办?1byte最多也就是255个字符,目前发现的汉字就有8W多,常用的也要近万了吧,255,太少了,不行,1byte无法装下我们博大精深的汉字。(从这儿也能体现英文真的很简单的样子,为什么的我的英文这么辣鸡呢?)
中国的方案GBK编码,用2byte来描述汉字,这样能描述最多65535(2^16=65536-1=65535,为什么又减1?因为0要占一个0位),这样大多数常用汉字,特殊字符等都能被映射出对应的二进制了。
然而全球化的今天,大多数使用万国码了,将所有国家的语言填进一个码表里面,这就是Unicode,它用4个字节,也就是2^32次方,这个数就很大了,0~2^32的范围可以描述所有的字符,但是这也带来一个问题,网络中以Unicode传输的时候,大多数都在传输无意义的00000.....这样的东西,导致带宽浪费。
UTF-8就是一个很好的设计,它是可变长度编码站1-4个字节,高位的1的数量来表示它占多少位,后面的位对应做映射,有效的缩减字节数。例如,高位时0((0000 xxxx))就占一个字节,高位两个1(1100 xxxx....)就占2字节,依次类推。
我也只能理解这么多了,更多的就需要自己动手了,个人理解的原理应该是这样的,希望指正和意见。