UTF-8作为一种可变长度的字符编码,他是如何知道一个字符到底需要几个字节表示呢?他是如何这么智能和聪明的?比如一个中文字符,在UTF-8编码中,可能需要占据三个字节的长度,而一个英文字符仅仅需要占据一个字节的长度。他们是如何协作,才得以保证不会输出乱码呢?这一切,就要从UTF-8的规定说起了,有了这个规则,就能保证字符总是可以正确显示了。如果一个字符只需要一个字节即可表示,那这个字节的二进制必须以0开始,如:0xxxxxxx如果一个字符需要两个字节才能表示,那么这个字符的第一个字节(高位字节),需要以110开头,第二个字节(低位字节)需要以10开头,如:110xxxxx 10xxxxxx如果一个字符需要三个字节才能表示,那么这个字符的高位字节,需要以1110开头,其余后面的两个低位字节已10开头,如:1110xxxx 10xxxxxx 10xxxxxx聪明如你,一定从上面的123中发现了某种不可告人的秘密规律。假如现在是一个汉字,那么需要用三个字节表示,其中有8位已经是固定的了,还有16位是可用的。虽然是用三个字节表示,但是有效位只有16位,有效位还是占两个字节。
何谓原码?一个数字的二进制表现形式就是原码。如:数字10,他的原码就是0000 1010何谓反码?在原码的基础上,符号位不变,其余位取反。如:数字10的反码是0111 00101什么是符号位?因为计算机中所有数据的存放都是二进制的,且基本单位是byte。为了区分正负数,人为规定一个byte中,最高位是0表示正数,最高位是1表示负数。如: 0000 0001 表示 +1,1000 0001表示 -1。何谓补码?在补码的基础上+1,就是一个负数的补码表现形式。如数字-10,原码是1000 1010,反码是1111 0101,反码是1111 0110。如果在计算过程中发生溢出,则舍弃。如:11111 1111,+1后发生溢出,最后的值是1000 0000其他正数的原码、反码、补码相同数字在计算机中,是以补码形式存放的
Minghui
却道天凉好个秋!
CC BY-NC-SA 4.0