byte 字节 与 二进制 与 编码

先扯一堆:byte(字节),bytes(字节流),二进制,十六进制,编码
今天跟同事讨论起了上面一堆名词之间的定义和关系到底是什么,不啦不啦个把小时之后得出了以下结论。

byte 与 二进制

byte 是二进制的长度单位(位数,为了便于理解后面使用长度一词),一个 byte 表示长度为 8 的二进制,即通常所说的:一个 byte 是 八个 bit(位)

既然 byte 是二进制的长度单位,那么编程语言里的其他类型呢?

它们其实也是二进制的长度单位,但是表示的长度不同,比如 int 表示 4 个字节(通常)也就是说 int 其实表示长度为 4 * 8 = 32 的二进制,其他类型以此类推,注意,char 类型表示一个 byte,也表示长度为 8 的二进制。

byte 是长度单位为什么能表示数值大小?

一个二进制数既然确定了其长度,那么也就确定了其能表示的数值范围,因此一个 byte 也就能表示出长度为 8 的二进制数所能表示的任何数值。

要注意,byte 是先确定了二进制长度,然后才确定了数值大小,具体的数值大小要看这固定长度的二进制每一位都是什么内容。

编码又是什么?

我们将编码分为狭义和广义两种。

狭义上来说是数值到字符的一种转换方法,这种也叫字符编码,比如 ASCII,UTF-8,GB-2312,GBK,UNICODE 等都属于这种。

如果从广义上来看,编码是一种动作:依照一定规则将一个东西转换成另一个东西,且还能转换回来。
那么此时再来看编码,是不是应该包含 十六进制?十进制?和八进制?这几个进制都可以理解为是从二进制转换而来的,是二进制的另一种表示方式,所以网上也有很多人将十六进制转换叫做十六进制编码。

延伸一下

二进制,十六进制这些都是一种数值的表示方法,大家都知道硬盘上的文件其实是以一堆二进制的数存储在硬盘上的,那么这一堆二进制数自然也可以由十六进制表示出来,无非就是一个很大的十六进制数,所以也就有了以十六进制方式打开一个文件的说法。