C++ 进制、位数、字节数与十六进制表示字节教程
一、引言
二、进制基础
(一)十进制(Decimal)
十进制是我们日常生活中最熟悉的计数系统,它使用 0 - 9 这十个数字来表示数值。每个数位的权重是 10 的幂次,从右到左依次递增。例如,数字 253 可以表示为:
[2\times10^2 + 5\times10^1 + 3\times10^0 = 2\times100 + 5\times10 + 3\times1 = 200 + 50 + 3 = 253]
在 C++ 中,我们直接书写的数值默认是十进制形式,例如:
int decimalNumber = 42;
这里的 42
就是十进制数。
(二)二进制(Binary)
计算机内部基于二进制进行数据的存储和处理,因为电子元件通常只有两种稳定状态(如开和关、高电平和低电平),可以方便地用 0 和 1 来表示。二进制数只有 0 和 1 两个数字,每个数位的权重是 2 的幂次。例如,二进制数 1011
转换为十进制为:
[1\times2^3 + 0\times2^2 + 1\times2^1 + 1\times2^0 = 8 + 0 + 2 + 1 = 11]
在 C++ 中,我们可以使用 0b
前缀来表示二进制数,例如:
int binaryNumber = 0b1010; // 对应十进制数 10
通过这种方式,我们可以在代码中直接使用二进制数,方便进行位运算等操作。
(三)十六进制(Hexadecimal)
十六进制是为了更紧凑地表示二进制数据而引入的进制系统。它使用 0 - 9 和 A - F 这十六个字符来表示数值,其中 A 代表 10,B 代表 11,以此类推,F 代表 15。每个数位的权重是 16 的幂次。例如,十六进制数 2A
转换为十进制为:
[2\times16^1 + 10\times16^0 = 32 + 10 = 42]
在 C++ 中,十六进制数使用 0x
前缀来表示,例如:
int hexadecimalNumber = 0x2F; // 对应十进制数 47
十六进制在表示内存地址、颜色值等方面非常常用,因为它能够用较少的位数表示较大的数值,并且与二进制之间的转换非常方便。
三、位数与字节数
(一)位(bit)
位是计算机中最小的数据存储单位,它只能表示 0 或 1。在计算机硬件层面,数据的存储和传输都是以位为基本单元进行的。例如,一个内存单元中的每一位都可以存储一个二进制值,多个位组合在一起就可以表示更大范围的数值。
(二)字节(Byte)
字节是计算机中常用的存储单位,1 字节等于 8 位。字节是 C++ 中许多数据类型的基本组成单位,例如,一个 char
类型的数据通常占用 1 字节的存储空间,它可以用来存储一个字符(如英文字母、数字或标点符号)。在内存中,数据是以字节为单位进行组织和访问的,每个字节都有一个唯一的内存地址。
四、十六进制数与字节的关系
由于 1 字节等于 8 位,而十六进制的一位可以表示 4 位二进制数(因为 (2^4 = 16)),所以 2 个十六进制数就可以精确地表示 1 个字节。
(一)示例 1:字节的二进制与十六进制表示
考虑一个字节的二进制数据:11001010
。我们将其按 4 位一组进行划分,得到 1100
和 1010
。1100
(二进制)对应的十六进制数是 C
,1010
(二进制)对应的十六进制数是 A
。所以,这个字节用十六进制表示就是 0xCA
。
(二)示例 2:十六进制数转换为字节的二进制
现在来看十六进制数 0x5F
。5
(十六进制)对应的二进制是 0101
,F
(十六进制,即 15 十进制)对应的二进制是 1111
。将它们组合起来,得到 01011111
,这正好是 1 个字节的二进制表示形式。