“深入理解计算机系统”小组学习的Task01-学习日志


前言

本文章为天池“深入理解计算机系统”小组学习的Task01-学习日志,旨在了解信息储存,整数表示、编码与运算以及浮点数


一、信息储存

1.虚拟地址空间

1.1.虚拟地址空间

  • 定义:程序将内存视为数组,数组的各元素由字节组成,每个字节由唯一数字(地址)表示,所有地址的集合为虚拟地址空间。

1.2 字数据大小

  • 字长决定了虚拟地址空间的最大的可以到多少,虚拟地址的范围是 0 到 2w-1。即字长为w bit, 其地址空间为0∼2w−1;32 位的机器,虚拟地址空间最大为4GB,而64位的机器,虚拟地址空间最大为16EB。
  • 多数64位机器向后兼容,32位机器编译的程序在32位和64位机器上均可运行,但64位机器编译的程序只能在64位机器运行,如果需要在32位机器上运行,需要通过 ‘linux> gcc -m32 -o hello32 hello.c’ 编译。32位和64位程序的区别主要在于程序是如何编译。

1.3 寻址和字节顺序

  • C 语言中,支持整数和浮点数多种数据格式,下表列式了不同数据类型在 32 位机器与 64 位机器上所占字节数的大小。由图可知,许多数据类型都是占用了多个字节空间。
    在这里插入图片描述

  • 大端法:最高有效字节存储在最前面,也就是低地址处。(0*01最高有效) IBM 和 Sun 公司的机器大多数机器采用大端法。

  • 小端法:最低有效字节存储在在最前面,大多数 Intel 兼容机采用小端模式,Android 系统和 iOS 系统也只能运行在小端模式。

  • 不同操作系统使用不同的存储分配规则,指针的值是完全不同的。32位的机器,使用4字节的地址,64位的机器使用8字节的地址。虽然整型和浮点数都是对数值12345进行编码,但是它们却有着完全不同的字节模式。

1.4 字符串的表示

  • C 语言中的字符串被编码为以 NULL 字符结尾的字符数组,如字符串“abcde”字符为5,长度为6,为“abcdenull”

1.5 布尔运算

  • 非(NOT)、或(OR)、 与(AND)、异或(EOR)

1.6 C 语言中的位级运算

  • C 语言中支持按位进行布尔运算,确定一个位级表达式结果的方式是将十六进制扩展成二进制表示,然后按位进行相应的运算,最后再转换回十六进制。

  • 位运算:可以实现掩码运算,可通过位运算得到特定的位序列。

  • 逻辑运算:所有非零的参数都表示 true,只有参数 0 表示 false。

二、数值表示与运算

1.整数

1.1.表示与编码

1.1.1. 有符号的二进制数的表示
  • 带有正、负号的二进制数称为真值,计算机中约定: 在有符号数的前面增加1位符号位,用0表示正号,用1表示负号。这种在计算机中用0和1表示正负号的数称为机器数。机器数编码方法有原码、反码和补码 3 种。
1.1.2. 原码
  • 正数的符号位用“0”表示,负数的符号位用“1”表示,其余数位表示数值本身,其中,0可以认为 +0,也可以认为是-0,其原码不唯一。原码加减运算较麻烦,为了简化运算,需要把减法做成加法运算,因此引入反码和补码。
1.1.3. 反码
  • 正数的反码与其原码相同; 负数的反码是在原码的基础上保持符号位不变,其余各位按位求反得到的。
1.1.4. 补码
  • 正数的补码与其原码相同; 负数的补码是在原码的基础上保持符号位不变,其它的数位1变为0,0变为1,最后再加1运算,负数的补码是它的反码+1。
1.1.5. 有符号数和无符号数相互转换
  • 需转换原因:在 C 语言中,执行一个运算时,如果一个运算数是有符号数,另外一个运算数是无符号数,那么 C 语言会隐式的将有符号数强制转换成无符号数来执行运算。

  • 有符号转无符号:用 T2U 来表示有符号数到无符号数的函数映射,当最高位 Xw−1 等于 1 时,此时有符号数 x 表示一个负数,经过转换后,得到的无符号数等于该有符号数加上2w;当最高位 Xw−1 等于 0 时,此时有符号数 x 表示一个非负数,得到的无符号数与有符号数是相等的。
    在这里插入图片描述

  • 无符号转有符号:用 U2T 来表示无符号数到有符号数的函数映射。当最高位等于0时,无符号数可以表示的数值小于有符号数的最大值,此时转换后的数值不变。当最高位等于 1时,无符号数可以表示的数值大于有符号数的最大值,在这种情况下,转换后得到有符号数等于该无符号数减去 2w 。
    在这里插入图片描述

1.1.6. 扩展数字位表示
  • 把无符号数转换成一个更大的数据类型,当有符号数表示非负数时,最高位是 0,此时扩展的数位进行补零即可;当有符号数表示负数时,最高位是 1,此时扩展的数位需要进行补 1。

  • 转换定理:当有符号数从一个较小的数据类型转换成较大类型时,进行符号位扩展,可以保持数值不变。

  • 截断:int 类型强制类型转换成 short 类型时, int 类型高 16 位数据被丢弃,留下低 16位的数据,截断数字,会改变原值。将一个 w 位的无符号数,截断成 k 位时,丢弃最高的 w-k 位,截断操作可以对应于取模运算,即除以 2 的 k 次方之后得到的余数。对于有符号数,需要先用无符号数的函数映射来解释底层的二进制位,再将前一步得到的无符号数转换成有符号数。

1.2.运算

1.2.1.无符号加法
  • 在 C 语言执行的过程中,对于计算结果溢出的情况并不会报错

  • 补码加法溢出:与无符号数相加不同的是,有符号数的溢出分为正溢出和负溢出。当 x 加 y 的和大于等于 2 ^(w−1) 时,发生正溢出,此时,得到的结果会减去 2^w。当 x 加 y 的和小于 −2^(w−1) 时,发生负溢出,此时,得到的结果会加上 2^w。

1.2.2.两种乘法(以乘2的整数倍为例)
  • 无符号:w 位的无符号数 x 和 y,二者的乘积可能需要 2w 位来表示。在 C 语言中,定义了无符号数乘法所产生的结果是 w 位,因此,运行结果会截取 2w 位中的低 w 位。截断采用取模的方式,因此,运行结果等于 x 与 y 乘积并对 2 的 w 次方取模。

  • 有符号:比无符号数乘法多一步,需要将无符号数转换成补码(有符号数)。虽然完整的乘积结果的位级表示可能会不同,但是截断后的位级表示均相同。

1.2.1.两种除法(以除以2的整数倍为例)
  • 原码运算: 对于原码,不论正负,若某个数字乘 2^w 的倍数,则只需要对原码向左移动 w 个单位,空缺位补 0。

  • 补码运算:正数则仍然按照原码规则进行计算,而负数则需要保证符号位不变,在向左移动时补 0,向右移动时补 1。

2.浮点数

2.1.IEEE 浮点表示

  • V = (−1)^s × M × 2^E(符号 s、阶码 E 和尾数 M)
  • 浮点数的数值可以分为三类:第一类是规格化的值,其阶码字段的二进制位不全为 0,且不全为 1 。第二类是非规格化的值,其阶码字段的二进制位全为 0 。第三类是特殊值。其阶码字段的二进制位全为 1 ,特殊值分类为两类,一类表示无穷大或者无穷小,另外一类表示“不是一个数”。

2.2.舍入

  • 定义:对于值 x,无法用浮点形式来精确的表示,找到“最接近的值x’来代替 x,通过舍入操作。IEEE 浮点格式定义了四种不同的舍入方式,分别是:向偶数舍入、向零舍入、向下舍入以及向上舍入。

  • 向下舍入总是朝向小的方向进行舍入,而向上舍入总是朝向大的方向进行舍入。

  • 向零舍入就是把正数进行向下舍入,把负数进行向上舍入。将这种舍入规则映射到数轴上,可以发现舍入是朝向零的方向。

  • 向偶数舍入,也被称为向最接近的值进行舍入。

2.2.浮点运算

  • 浮点数的加法和乘法不具有结合性,乘法在加法上不具备分配性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值