深入理解计算机操作系统(2.1.1、2.1.2)
信息存储
计算机中字节(8位二进制)是最小的内存单位,意思就是小于8位二进制的表示都是没有意义的。内存中每个字节都有唯一的数字来表示,称为地址。
2.1.1十六进制表示法
由于二进制表示比较冗余,而十进制转化二进制又比较麻烦,所以就有了十六进制。
十六进制以0x开头,使用字符“0-9”和“A-F”来表示。
一位十六进制数表示四位二进制数,因为一位16进制数最大能表示15,而四位二进制数最大值是15,所以就用四位二进制数表示一位十六进制数。
这一节主要说了16进制和二进制之间的转换,下面举个例子来理解。
十六进制转二进制:
十六进制数:0x4C
4 C
0100 1100
转换成二进制:01001100
0x4C转换成十进制:4*16+12 = 76
01001110转换成十进制:2^6+2^3+2^2 = 64 + 8 + 4 = 76
二进制转十六进制:
给定一个二进制数转成十六进制,可以按每四个一组来分。如果二进制位数不是4的倍数,最左边一组可以少于4个,前面补0,所以划分时从右边开始划分。
二进制数:1100111101
11 0011 1101
补0之后变成:
0011 0011 1101
3 3 D
十六进制数:0x33D
2.1.2字数据大小
这一节的主要内容就是字长以及32位和64位机器。
每台计算机都有一个字长,指明指针数据的标称大小。(这个概念暂时没理解,但是因为指针指向的是一个地址,所以这个大小我个人认为是指针的大小)
前面2.1中提到每个字节都有一个唯一的数字来标识,这个数字就是字长。所以字长的大小就决定了计算机支持的内存集合大小。平时大家经常说的32位的电脑最大支持4G的内存就是这里来的。32位机器指的字长为32位,那么可表示的最大的数字就是2^32-1,那么内存地址的集合就是0~2^32-1,所以最大可支持的内存空间就是2^32-1字节。
C语言的一些数据类型在32位和64位机器上占用的字节数不相同,所以一个程序如果是按照64位机器编译的,那么改程序则不能在32位机器上运行,反之则可以,因为64位机器是向下兼容的。书中还强调了,“32位程序”和“64位程序”区别是在于该程序是如何编译的,而不是其运行的机器。例如:linux>gcc -m32 HelloWorld.c和linux>gcc -m64 HelloWorld.c,后者编译的程序就只能在64位机器上运行。
后来为了避免依赖编译器编译,ISO C99引入了一类数据类型,其数据大小是固定的,不随编译器和机器设置而变化,例如int32_t和int64_t就表示占用的字节分别为4个和8个,这样程序的可移植性就变高了。
总结
如果有不理解的地方或者认为我理解的不正确的,可以留言一起交流讨论,我会持续更新后面的章节。