机器数分类有两个维度:(1)有无符号(2)整数小数。两个维度交叉来看,有如下结论:
已知:
理解方法:
此外,需要注意的是取值范围。已知机器字长为 n n n,而且机器数中第一位为符号位,所以取值范围为: − ( 2 n − 1 − 1 ) ≤ X ≤ 2 n − 1 − 1 -(2^{n-1}-1) \le X \le 2^{n-1}-1 −(2n−1−1)≤X≤2n−1−1。
对于上述理解方法,有如下公式:
公式如下:
已知:
理解方法:
对于上述理解方法,有如下公式:
公式如下:
补充:对于公式的理解:
如果读者对上述公式
2
−
2
−
(
n
−
1
)
+
X
2-2^{-(n-1)}+X
2−2−(n−1)+X 不理解,有解释如下:
2
−
2
−
(
n
−
1
)
2-2^{-(n-1)}
2−2−(n−1) 使得机器数中所有位的值都为1,然后
+
X
+X
+X,等同于
−
∣
X
∣
-|X|
−∣X∣;
已知:
理解方法:
对于上述理解方法,有如下公式:
公式如下:
仔细的读者会发现,补码相较于原码和反码,在取值范围上有变化。比如由 − ( 2 n − 1 − 1 ) -(2^{n-1}-1) −(2n−1−1) 变为了 − 2 n − 1 -2^{n-1} −2n−1,或者说,为什么补码有 -128?
在原码和反码系统中,存在两个零,即正零和负零,这导致了一些混淆和不便。例如,对于8位二进制,+0可以表示为00000000,而-0可以表示为10000000(最高位是符号位)。这就引入了一些奇怪的数学性质,例如+0和-0的加法不等于零。
而在补码系统中,没有+0和-0的概念。这是因为补码中的最高位是用来表示符号的,所以它只有一个零,即00000000表示零,而10000000表示-128。这个表示方法消除了零的二义性,使数学运算更一致和直观。
而原码和反码表示方式,通常不再常用,因为它们引入了不必要的复杂性和不一致性。补码系统解决了原码和反码系统中的一些问题,提供了更好的数学性质和更广泛的整数表示范围,因此在计算机中广泛使用。
所以,-128 存在于补码中。将所有位取反(0变1,1变0),然后加1。
10000000 -> 01111111 + 1 = 10000000
已知:
理解方法:
此外,需要注意的是取值范围。已知机器字长为 n n n,而且机器数中第一位为符号位,所以取值范围为: − ( 2 n − 1 − 1 ) ≤ X ≤ 2 n − 1 − 1 -(2^{n-1}-1) \le X \le 2^{n-1}-1 −(2n−1−1)≤X≤2n−1−1。
对于上述理解方法,有如下公式:
公式如下: