【计算机系统】整数与浮点数【详解】(一)

简介: 【计算机系统】整数与浮点数【详解】(一)

整数与浮点数【详解】(一)

目录

1、模运算与阿贝尔群

整数分为无符号数和有符号数。整数在计算机上的运算是模运算,形成的数学结构称为阿贝尔群,阿贝尔群具有以下特点:

①满足运算的交换律和结合律公理

②整数具有单位元——0

③整数具有逆元

由于模运算导致阿贝尔群产生,从而导致了整数与浮点数在运算性质上的极大不同。整数支持加法和乘法的交换律、结合律;而浮点数因为精度的限制,没有交换律和结合律,因此浮点的运算要格外的小心。


image.png

下面理解模运算。考虑图1的循环队列,在入队时队尾指针rear=(rear+1)%MaxSize,例如入队前rear指向索引4,那么入队一个新元素后rear=5%5=0。设想如果没有这样模运算rear就将等于5,而5是循环队列中不存在的“溢出数”,规避溢出数的做法就是模运算。在整数结构里,和循环队列对应,整数同样有MaxSize,整数间的运算或是求逆元都可能造成类似循环队列中规避溢出数的现象,因此整数操作采用了同样的模运算。

例如,32bit的数据类型int定义下的算式:

500*400*300*200
>>> -884901888

这个结果很反常,但其本质是模运算规避溢出数的结果。值得注意,对于程序本身,一个数达到了MaxSize,程序就会自认“合理”地采用循环队列的模运算,再从数据大小的起点开始重新计数,这样计算的值就不会超出MaxSize;但是对于操作者而言,即使计算的数确实仍然在该数据类型对应的范围内,但结果已经失去了意义,这种情况下,我们依旧认为出现了溢出(Overflow)。由于程序层面上可以编译通过,所以一般不会造成系统报错;但操作者却要格外小心这类不报错的致命错误。具体的细节和原因接下来阐述。

2、有符号数与无符号数

给出无符号数和有符号数的定义,假设一个 w w w位位向量 x ⃗ x ⃗ x⃗=[ x ( w − 1 ) x_{(w-1)} x

(w−1)


, x ( w − 2 ) x_{(w-2)} x

(w−2)


,…… x 0 x_0 x

0


],则

B 2 U w ( x ⃗ ) = ∑ i = 0 w − 1 2 i x i B2U_w (x ⃗ ) = \sum_{i=0}^{w-1}{2^i}x_i

B2U

w


(x⃗)=

i=0

w−1


2

i

x

i



即二进制转无符号数,其位权均为正。无符号数是二进制的十进制数

B 2 T w ( x ⃗ ) = − x w − 1 2 i + ∑ i = 0 w − 2 2 i x i B2T_w (x ⃗ ) =-x_{w-1}2^i+ \sum_{i=0}^{w-2}{2^i}x_i

B2T

w


(x⃗)=−x

w−1


2

i

+

i=0

w−2


2

i

x

i



即二进制转有符号数,其位权首位为负,其余为正。有符号数是二进制补码的十进制数


可以证明上述的位向量和有符号数、无符号数是一一对应的。一个位向量必由一个无(有)符号数对应,一个无(有)符号数也只对应一个位向量。要注意的是无符号数对应的位向量是二进制数(首位不是符号位),有符号数对应的是二进制补码。


由定义可以直接导出有符号数和无符号数的数值范围


image.png

整数的运算的本质都是基于这个数据范围进行模运算。

3、加法逆元

从前面知道,模运算导致了阿贝尔群,阿贝尔群的特点是具有逆元。整数的单位元为0,因此整数x加它的逆元应该要等于0

①无符号数的逆元

考虑的是x加多少可以为0,而不是把逆元当作负号对待。如图3(i),从 x x x到 U m a x = 2 w − 1 U_{max}=2^w-1 U

max


=2

w

−1要加 2 w − 1 − x 2^w-1-x 2

w

−1−x,此时若再加1,由循环队列的模运算就相当于为0,于是无符号数的加法逆元为:

− x = { 0 , x = 0 2 w − x x ≠ 0 -x=\left\{

0,2w−xx=0x≠0

0,x=02w−xx≠0

\right.

−x={


 

0,

2

w

−x


 

x=0

x


=0

 

image.png

②有符号数的加法逆元

考虑的是x加多少可以为0。如图3(ii),看出正负元素间的轴对称关系,即1~ 2 w − 1 − 1 2^{w-1}-1 2

w−1

−1都有唯一的对称负元素与之对应,因此对于 x ≠ T m i n x≠T_{min} x


=T

min


的情况可以认为逆元就是x的相反数,也就是数学上的意义;对于 x = T m i n x=T_{min} x=T

min


的情况由于没有对称元素就要借助最基本的模运算, T m i n T_{min} T

min


从正负两个方向看与0的距离都是 ∣ T m i n ∣ |T_{min}| ∣T

min


∣,又考虑到w位的有符号数 T m a x = 2 w − 1 − 1 T_{max}=2^{w-1}-1 T

max


=2

w−1

−1,因此不能从正方向加上 2 w − 1 2^{w-1} 2

w−1

这个数,因此采取的方式就是从负方向上减去一个 ∣ T m i n ∣ |T_{min}| ∣T

min


于是有符号数的加法逆元为:

− x = { − x , x ≠ T m i n T m i n x = T m i n -x=\left\{

−x,Tminx≠Tminx=Tmin

−x,x≠TminTminx=Tmin

\right.

−x={


 

−x,

T

min



 

x


=T

min


x=T

min


 

小结

整数与浮点数系列依然是对CSAPP相关知识点的总结与理解。在下一篇博客里,将继续介绍整数的截断有符号无符号数转换等知识,如有不足还请指出。

目录
相关文章
|
7月前
|
存储
【机组期末速成】计算机的运算方法|进制转换|无符号数与有符号数|数的定点表示与浮点表示|定点运算
【机组期末速成】计算机的运算方法|进制转换|无符号数与有符号数|数的定点表示与浮点表示|定点运算
192 0
|
1月前
|
存储 Java C++
浮点数(小数)在计算机中如何用二进制存储?
本文详细介绍了浮点数在计算机中如何用二进制存储,包括符号、指数和尾数三部分的组成及其计算方法。作者通过具体例子,如 `11.1875` 和 `0.1875` 的二进制表示,解释了如何将小数转换为二进制,并讨论了指数部分的“EXCESS系统表现”。文章还提到浮点数运算中的精度问题,并提供了进一步学习的参考资料。
49 2
浮点数(小数)在计算机中如何用二进制存储?
|
7月前
|
存储
整数和浮点数在内存中存储
整数的2进制表⽰⽅法有三种,即原码、反码和补码。
84 0
|
7月前
|
存储 小程序 编译器
整数和浮点数在内存中的存储​(大小端详解)
整数和浮点数在内存中的存储​(大小端详解)
计算机组成原理——浮点数加减运算&强制类型转换
计算机组成原理——浮点数加减运算&强制类型转换
837 0
计算机组成原理——浮点数加减运算&强制类型转换
【软考学习3】数据表示——浮点数计算 + 单精度浮点数IEEE754计算
【软考学习3】数据表示——浮点数计算 + 单精度浮点数IEEE754计算
314 0
浮点数在内存中的运算
这篇博客将给大家介绍浮点数在内存中是如何进行计算的
二进制浮点数的加减法运算
二进制浮点数的加减法运算
|
编译器 C++
C++ 字符串转浮点数,包括整数、小数和科学记数法
C++ 字符串转浮点数,包括整数、小数和科学记数法
642 0
|
存储
【计算机组成原理】定点数和浮点数
一、概念 1. 定点数 1. 定点小数 2. 定点整数 3. 定点数表示的范围 2. 浮点数 1. 浮点数的表示形式 2. 浮点数的表示范围 3. 浮点数的规格化 二、重点 1. 将十进制数转换为浮点数 2. 将浮点数转换为十进制数
644 0
【计算机组成原理】定点数和浮点数