二进制编码

原码表示法

缺点:0可以用两个不同的编码来表示,1000代表0, 0000也代表0。

计算整个二进制值的时候,在左侧最高位前面加个负号

0011这个二进制数,对应的十进制表示
− 1 × 2 3 + 0 × 2 2 + 1 × 2 1 + 1 × 2 0 -1×2^3+0×2^2+1×2^1+1×2^01×23+0×22+1×21+1×20
这种方法可以表示从-8到7这16个整数,不会白白浪费一位。

在这里插入图片描述
用8位二进制中的128个不同的数,映射到128个不同的字符里

字符串15变成两个字符1和5连续放在一起,也就是 0011 0001 和 0011 0101,需要用两个8位来表示。

最大的32位整数,就是2147483647。如果用整数表示法,只需要32位就能表示了。但是如果用字符串来表示,一共有10个字符,每个字符用8位的话,需要整整80位。比起整数表示法,要多占很多空间。

不管是整数也好,浮点数也好,采用二进制序列化会比存储文本省下不少空间。

想要表示譬如中文这样的文字,128个字符显然是不太够用的。于是,计算机工程师们开始各显神通,给自己国家的语言创建了对应的字符集(Charset)和字符编码(Character Encoding)。

字符集,譬如:第一版《新华字典》里面出现的所有汉字

Unicode:是一个字符集,包含了150种语言的14万个不同的字符。

字符编码:对于字符集里的这些字符,怎么一一用二进制表示出来的一个字典。

同样的文本,采用不同的编码存储下来。如果另外一个程序,用一种不同的编码方式来进行解码和展示,就会出现乱码。

我曾经听说过这么一个笑话,没有经验的同学,在看到程序输出“烫烫烫”的时候,以为是程序让CPU过热发出报警,于是尝试给CPU降频来解决问题。

“烫烫烫”,则是因为如果你用了Visual Studio的调试器,默认使用MBCS字符集。“烫”在里面是由0xCCCC来表示的,而0xCC又恰好是未初始化的内存的赋值。于是,在读到没有赋值的内存地址或者变量的时候,电脑就开始大叫“烫烫烫”了。


版权声明:本文为qq_30763385原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。