CS61C | lecture1
计算机系统抽象
二进制可以表示任何东西
n 位数字(base B) 可以表示 <= B n B^n Bn 个事物
数字
计算机中,用二进制表示数字
$$
\begin{aligned}
& d_{n-1}d_{n-2}…d_1d_0(n位数字由B为基) \
=& ~~d_{n-1} \times B^{n-1} + d_{n-2} \times B^{n-2} + … d_1 \times B^1
- d_0 \times B^0
\end{aligned}
$$
字符
26 个字符用 5 bits 可以表示
ASCII: 7 bits
布尔值
0 -> False
1 -> True
unsigned
x = 0 b 1010 = 2 3 + 2 1 = 10 \begin{aligned} x &= 0b1010 \\ & = 2^3 + 2^1 = 10 \end{aligned} x=0b1010=23+21=10
sign and magnitude
将第一位作为符号,剩下的作为无符号数。
0
0
0
t
w
o
=
+
0
t
e
n
0
0
1
t
w
o
=
+
1
t
e
n
0
1
0
t
w
o
=
+
2
t
e
n
0
1
1
t
w
o
=
+
3
t
e
n
1
0
0
t
w
o
=
−
0
t
e
n
1
0
1
t
w
o
=
−
1
t
e
n
1
1
0
t
w
o
=
−
2
t
e
n
1
1
1
t
w
o
=
−
3
t
e
n
\begin{aligned} \textcolor{red}{0}00_{two} &= \textcolor{red}{+}0_{ten} \\ \textcolor{red}{0}01_{two} &= \textcolor{red}{+}1_{ten} \\ \textcolor{red}{0}10_{two} &= \textcolor{red}{+}2_{ten} \\ \textcolor{red}{0}11_{two} &= \textcolor{red}{+}3_{ten} \\ \\ \textcolor{blue}{1}00_{two} &= \textcolor{blue}{-}0_{ten} \\ \textcolor{blue}{1}01_{two} &= \textcolor{blue}{-}1_{ten} \\ \textcolor{blue}{1}10_{two} &= \textcolor{blue}{-}2_{ten} \\ \textcolor{blue}{1}11_{two} &= \textcolor{blue}{-}3_{ten} \\ \end{aligned}
000two001two010two011two100two101two110two111two=+0ten=+1ten=+2ten=+3ten=−0ten=−1ten=−2ten=−3ten
这样就会导致存在两个 0,
0...
0
t
w
o
a
n
d
10...
0
t
w
o
=
±
0
t
e
n
0...0_{two}~and~10...0_{two} = \pm 0_{ten}
0...0two and 10...0two=±0ten
最大的正数
01...
1
t
w
o
=
(
2
(
n
−
1
)
−
1
)
t
e
n
01...1_{two}= (2^{(n-1)}-1)_{ten}
01...1two=(2(n−1)−1)ten
最小的负数
1...
1
t
w
o
=
−
(
2
(
n
−
1
)
−
1
)
t
e
n
1...1_{two}=-(2^{(n-1)} - 1)_{ten}
1...1two=−(2(n−1)−1)ten
x
=
0
b
1010
=
−
1
×
2
1
=
−
2
\begin{aligned} x &= 0b1010 \\ & = -1 \times 2^1 = -2 \end{aligned}
x=0b1010=−1×21=−2
biased notation
类似于 unsigned,但是会有偏移从而让 0 粗略的在中间。值 = “unsigned value” - bias
传统偏移量
(
2
(
n
−
1
)
−
1
)
(2^{(n-1)} - 1)
(2(n−1)−1)
00
0
t
w
o
=
−
3
t
e
n
00
1
t
w
o
=
−
2
t
e
n
01
0
t
w
o
=
−
1
t
e
n
01
1
t
w
o
=
0
t
e
n
10
0
t
w
o
=
+
1
t
e
n
10
1
t
w
o
=
+
2
t
e
n
11
0
t
w
o
=
+
3
t
e
n
11
1
t
w
o
=
+
4
t
e
n
\begin{aligned} 000_{two} &= -3_{ten} \\ 001_{two} &= -2_{ten} \\ 010_{two} &= -1_{ten} \\ \textcolor{red}{011_{two}} &\textcolor{red}{= 0_{ten}} \\ 100_{two} &= +1_{ten} \\ 101_{two} &= +2_{ten} \\ 110_{two} &= +3_{ten} \\ 111_{two} &= +4_{ten} \\ \end{aligned}
000two001two010two011two100two101two110two111two=−3ten=−2ten=−1ten=0ten=+1ten=+2ten=+3ten=+4ten
此时,0 为
01...
1
t
w
o
=
0
t
e
n
01...1_{two}=0_{ten}
01...1two=0ten
最大的正数
1...
1
t
w
o
=
(
2
(
n
−
1
)
)
t
e
n
1...1_{two} = (2^{(n-1)})_{ten}
1...1two=(2(n−1))ten
最小的负数
0...
0
t
w
o
=
−
(
2
(
n
−
1
)
−
1
)
t
e
n
0...0_{two}=-(2^{(n-1)} - 1)_{ten}
0...0two=−(2(n−1)−1)ten
x = 0 b 1010 = 2 3 + 2 1 − ( 2 3 − 1 ) = 3 \begin{aligned} x &= 0b1010 \\ & = 2^3 + 2^1 - (2^3 - 1) = 3 \end{aligned} x=0b1010=23+21−(23−1)=3
one’s complement
00
0
t
w
o
=
+
0
t
e
n
00
1
t
w
o
=
+
1
t
e
n
01
0
t
w
o
=
+
2
t
e
n
01
1
t
w
o
=
+
3
t
e
n
10
0
t
w
o
=
−
3
t
e
n
10
1
t
w
o
=
−
2
t
e
n
11
0
t
w
o
=
−
1
t
e
n
11
1
t
w
o
=
−
0
t
e
n
\begin{aligned} 000_{two} &= +0_{ten} \\ 001_{two} &= +1_{ten} \\ 010_{two} &= +2_{ten} \\ 011_{two} &= +3_{ten} \\ \\ 100_{two} &= -3_{ten} \\ 101_{two} &= -2_{ten} \\ 110_{two} &= -1_{ten} \\ 111_{two} &= -0_{ten} \\ \end{aligned}
000two001two010two011two100two101two110two111two=+0ten=+1ten=+2ten=+3ten=−3ten=−2ten=−1ten=−0ten
然而此时 0 有两个
0...
0
t
w
o
a
n
d
1...
1
t
w
o
=
±
0
t
e
n
0...0_{two}~and~1...1_{two} = \pm0_{ten}
0...0two and 1...1two=±0ten
最大的正数
01...
1
t
w
o
=
(
2
(
n
−
1
)
−
1
)
t
e
n
01...1_{two} = (2^{(n-1)}-1)_{ten}
01...1two=(2(n−1)−1)ten
最小的负数
10...
0
t
w
o
=
−
(
2
(
n
−
1
)
−
1
)
t
e
n
10...0_{two} = -(2^{(n-1)}-1)_{ten}
10...0two=−(2(n−1)−1)ten
x
=
0
b
1010
−
x
=
∼
x
=
0
b
0101
=
5
x
=
−
5
\begin{aligned} x &= 0b1010 \\ -x& = \sim x = 0b0101 = 5 \\ x &= -5 \end{aligned}
x−xx=0b1010=∼x=0b0101=5=−5
two’s complement
00
0
t
w
o
=
+
0
t
e
n
00
1
t
w
o
=
+
1
t
e
n
01
0
t
w
o
=
+
2
t
e
n
01
1
t
w
o
=
+
3
t
e
n
10
0
t
w
o
=
−
4
t
e
n
10
1
t
w
o
=
−
3
t
e
n
11
0
t
w
o
=
−
2
t
e
n
11
1
t
w
o
=
−
1
t
e
n
\begin{aligned} 000_{two} &= +0_{ten} \\ 001_{two} &= +1_{ten} \\ 010_{two} &= +2_{ten} \\ 011_{two} &= +3_{ten} \\ \\ 100_{two} &= -4_{ten} \\ 101_{two} &= -3_{ten} \\ 110_{two} &= -2_{ten} \\ 111_{two} &= -1_{ten} \\ \end{aligned}
000two001two010two011two100two101two110two111two=+0ten=+1ten=+2ten=+3ten=−4ten=−3ten=−2ten=−1ten
对于 0,只有
0...
0
t
w
o
=
0
t
e
n
0...0_{two} = 0_{ten}
0...0two=0ten
最大的正数
01...
1
t
w
o
=
(
2
(
n
−
1
)
−
1
)
t
e
n
01...1_{two} = (2^{(n-1)} - 1)_{ten}
01...1two=(2(n−1)−1)ten
最小的负数
10...
0
t
w
o
=
(
−
2
(
n
−
1
)
)
t
e
n
10...0_{two}=(-2^{(n-1)})_{ten}
10...0two=(−2(n−1))ten
正数翻转所有位并加 1 可以得到负数。
x = 0 b 1010 − x = ∼ x + 1 = 0 b 0101 + 1 = 0 b 0110 = 6 x = − 6 = − 2 3 + 2 1 = − 8 + 2 = − 6 \begin{aligned} x &= 0b1010 \\ -x& = \sim x + 1= 0b0101 + 1 = 0b0110 = 6 \\ x & = -6 \\ & = -2^3 + 2^1 = -8 + 2 = -6 \end{aligned} x−xx=0b1010=∼x+1=0b0101+1=0b0110=6=−6=−23+21=−8+2=−6
对于补码来说
会溢出 | 不会溢出 |
---|---|
+ + + | - + + |
- + - | + + - |