数据的二进制表示

整数

二进制使用最高位表示符号位,0表示正数,1表示负数。n位有符号整数的表示范围是:-2^n ~ 2^n-1

正整数

原码表示。

负整数

补码表示。原码取反加一。

小数

只有2的次方和的小数能用二进制精确表示,其余小数用二进制表示时都会丢失精度,只是有时候误差非常小,计算机忽略掉了这个非常小的数字。不精确才是常态。

  • float: 32位,1位表示符号,23位表示尾数,8位表示指数。
  • double:64位,1位表示符号,52位表示尾数,11位表示指数。

字符编码

ASCII

1字节。最高位为0,其余7位表示128个字符。其他编码都兼容ASCII,最高位使用1来区分。

GB2312, GBK, GB18030

中文简体和繁体,内地使用。三种编码方式表示的字符数越来越多,且后面的兼容前面的。GB2312和GBK为2字节,GB18030为2或4字节。

Big5

中文繁体,香港和台湾使用。虽然Big5和GB18030都可以表示繁体,但是两者不兼容。

Unicode

Unicode给世界上所有字符都规定了一个统一的编号,编号范围多达110多万,但大部分常用字符都在65536以内。Unicode本身没有规定怎么把编号对应到二进制形式。

UTF-32/UTF-16/UTF-8用来将Unicode编号对应到二进制形式,其对应方法不同而已。UTF-32使用4个字节,UTF-16大部分使用2个字节,少部分4字节,他们都不兼容ASCII编码,都有字节序的问题(BE和LT)。UTF-8使用1~4字节,兼容ASCII编码,英文字符使用1字节,中文字符大多使用3字节。

Java内部进行字符处理时,采用的是UTF-16BE的编码方式。

类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。而有些软件不能识别BOM头,就会产生乱码,比如PHP。

posted @ 2022-05-21 23:47  煮茶听风雨  阅读(593)  评论(0编辑  收藏  举报