Administrator
发布于 2026-04-02 / 3 阅读
0
0

开始之前(一)

其实现在我们就已经在学习计算机的路上了,只不过我们需要首先普及一些更为通用的知识。

这一章的主要内容是数据类型和地址。

在计算机的世界当中,一个数据至少需要包含两个信息:数据类型、数据地址。前者告诉计算机这个数据对应的一组比特该怎么解释,后者告诉计算机这一组比特在哪。

数据类型

计算机当中提供了三种基础的数据类型:整型、浮点和字符。在这三种数据类型的基础上,可以再衍生出一系列相对复杂的类型,比如数组、指针和字符串。

整型

整型用来表示整数。在计算机当中,通常使用补码来表示有符号整数,使用原码来表示无符号整数(无符号整数在计算机当中只有正的)。整型没有特定的结构,我们可以直接将一个整型数按照二进制到十进制的转换转成十进制表示方式。在计算机当中,整型的长度一般是8*2^k,比如8位/16位/32位/64位,部分语言存在128位整型(很少),也有极个别语言对整型不限制长度,编程语言一般都会提供有符号和无符号两种整型类型(极个别语言会将有符号和无符号统称为整型)。

浮点数

浮点用来表示小数或者极大的数。在计算机当中,一个值为S*(1+M)*(2^E)浮点数一般用这样的结构表示:S E-bias M,其中S表示符号,M为浮点数的小数部分,E表示浮点数的指数位。这一标准由IEEE 754定义,并且提供了具体的结构:

类型

符号位S

指数位E

偏移值bias

底数位M

32位浮点数(float/FP32)

1

8

127

23

64位浮点数(double)

1

11

1023

53

80位浮点数(long double for Intel)

1

15

16383

64

128位浮点数(long double for SPARC)

1

15

16383

113

在计算机浮点数当中,有这么几个需要解释的特殊状态:

  1. 指数位全为1,底数不为零:表示NaN(Not a Number)。

  2. 指数位全为1,底数全为零:表示Inf(Infinite,无穷),正负由符号位决定。

  3. 指数位全为0,底数不为零:此时的计算结果应该为s*0.M*2^(1-bias),表示非格式化值,可以表示极小的特殊值。

  4. 指数位全为0,底数全为零:0.0。在浮点数当中,0是一个不寻常的数,因为+0.0和-0.0似乎是不同的(同时需要注意的是,如果要比较两个浮点数是否一致,尽量不要用等号,而应该用绝对值标记,即:判断两个浮点数的差是否小于一个足够小的值)。

字符

字符本质上是一种特殊的整型,因为字符在计算机当中存放时,需要首先通过一套叫做“字符集”的东西(比如Unicode、ASCII、ANSI,以及经典的GB-2312)转换成整数编码,然后再存放到计算机当中。字符类型和整型类型唯一的区别在于两者的解释方式不同,整型可以直接进行解释,而字符需要首先解释为整型,然后根据字符集将整型解释为字符。一般来说,字符的宽度会随着编程语言默认采用的字符集而变化,不同字符集的默认长度放在下面:

字符集

涵盖字符数量

编码长度

ASCII

127

1字节

GB2312

7445

2字节

Big5

13053

2字节

UTF-8(Unicode)

最大1114112

1~3字节

UTF-16(Unicode)

最大1114112

2~3字节

UTF-32(Unicode)

最大1114112

4字节

对于大部分编程语言,默认支持的都是ASCII字符集;不过随着技术的发展,大部分编程语言已经提供了原生或补充的Unicode字符集支持。

大端序和小端序

这是一个在多字节类型当中常见的问题,具体的起源可以追溯到上世纪六十年代前后,这里我们不讲历史。

大端序和小端序最本质的区别在于多字节类型是怎么存放的。以32位有符号整数为例,在人类书写时一般会按照高位在左低位在右的原则,书写出来是从高到低从左到右的,这种方式称为大端序(大的一端在前面);而在现代的大部分计算机当中,通常是低位在左高位在右(类似于阿拉伯文的书写方式),这种方式称为小端序(小的一端在前面)。两种方式在一般情况下不会产生影响,但是对于二进制数据流和类型转换会产生很大的影响,这里我们会在C语言教程当中提及。

关于单字节的端序问题:单字节不存在端序问题,因为计算机当中通常是以字节为单位进行存放,一个字节(8位)内部始终是高位在左低位在右。对于大端序和小端序问题也是类似,始终是以字节为单位来判断端序,例如对于32位整数0x12345678,大端序存放的内容是12 34 56 78,小端序存放的内容是78 56 34 12

地址

在计算机当中,地址用来描绘一个数据的位置。地址通常与计算机的地址空间大小有关,且只使用无符号整数来表示。

在编程语言当中,通常会有一类特殊的整型变量来保存“地址”:指针。指针的作用和“门牌号”类似,它所表示的是一个数据的起点在计算机(通常是内存)当中的位置。比如一个32位整数0x11223344在内存的1000~1003号单元存放,那么就会使用1000来描述这个整数的地址,同样的,可以用一个变量来保存1000这个值,这时这个变量就被称作“指针”。


评论