“软件设计师精讲 数据的表示 码制”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
 
(未显示同一用户的23个中间版本)
第24行: 第24行:
 
!数值1(正1)
 
!数值1(正1)
 
!数值-1(负1)
 
!数值-1(负1)
 +
!1-1(也就是1+(-1))
 
|-
 
|-
 
|原码
 
|原码
 
|0000  0001
 
|0000  0001
 
|1000  0001
 
|1000  0001
 +
|1000 0010
 
|}
 
|}
 
1+(-1)=0,在原码形式中,用1的原码加-1的原码:
 
1+(-1)=0,在原码形式中,用1的原码加-1的原码:
第42行: 第44行:
 
!数值1(正1)
 
!数值1(正1)
 
!数值-1(负1)
 
!数值-1(负1)
 +
!1-1(也就是1+(-1))
 
|-
 
|-
 
|原码
 
|原码
 
|0000  0001
 
|0000  0001
 
|1000  0001
 
|1000  0001
 +
|1000 0010
 
|-
 
|-
 
|反码
 
|反码
 
|0000  0001
 
|0000  0001
 
|1111  1110
 
|1111  1110
 +
|1111 1111
 
|}
 
|}
 
正1的反码和负1的反码相加是:0000 0001+1111 1110=1111 1111,从反码来看,符号位不变,其他位按位取反,得到的原码就是1000 0000,也就是-0。
 
正1的反码和负1的反码相加是:0000 0001+1111 1110=1111 1111,从反码来看,符号位不变,其他位按位取反,得到的原码就是1000 0000,也就是-0。
第62行: 第67行:
 
!数值1(正1)
 
!数值1(正1)
 
!数值-1(负1)
 
!数值-1(负1)
 +
!1-1(也就是1+(-1))
 
|-
 
|-
 
|原码
 
|原码
 
|0000 0001
 
|0000 0001
 
|1000 0001
 
|1000 0001
 +
|1000 0010
 
|-
 
|-
 
|反码
 
|反码
 
|0000 0001
 
|0000 0001
 
|1111 1110
 
|1111 1110
 +
|1111 1111
 
|-
 
|-
 
|补码
 
|补码
 
|0000 0001
 
|0000 0001
 
|1111 1111
 
|1111 1111
 +
|(1) 0000 0000
 
|}
 
|}
'''<u>补码:正数的补码与源码相同,负数的补码是其反码末位加1(符号位不变)。</u>'''
+
'''<u>补码:正数的补码与源码相同,负数的补码是其反码的基础上末位加1(符号位不变)。</u>'''
  
 
正1的补码和负1的补码相加是:0000 0001+1111 1111=(1) 0000 0000,但是计算机取固定8位字长,进位的1就被丢弃掉了,得到后面的 0000 0000。
 
正1的补码和负1的补码相加是:0000 0001+1111 1111=(1) 0000 0000,但是计算机取固定8位字长,进位的1就被丢弃掉了,得到后面的 0000 0000。
  
 
通过符号位来看,是一个正数,它的数值位——正数的原码、反码、补码都是一样的。0000 0000就是0。
 
通过符号位来看,是一个正数,它的数值位——正数的原码、反码、补码都是一样的。0000 0000就是0。
 +
 +
 +
'''<u>移码:补码的基础上符号位按位取反</u>'''
 +
{| class="wikitable"
 +
|+
 +
!
 +
!数值1
 +
!数值-1
 +
!1-1(也就是1+(-1))
 +
|-
 +
|原码
 +
|0000 0001
 +
|1000 0001
 +
|1000 0010
 +
|-
 +
|反码
 +
|0000 0001
 +
|1111 1110
 +
|1111 1111
 +
|-
 +
|补码
 +
|0000 0001
 +
|1111 1111
 +
|0000 0000
 +
|-
 +
|移码
 +
|1000 0001
 +
|0111 1111
 +
|1000 0000
 +
|}
 +
09:05
 +
{| class="wikitable"
 +
|+
 +
注: n 表示字长
 +
!码制
 +
!定点整数
 +
!定点小数
 +
!数码个数
 +
|-
 +
|原码
 +
| -(2<sup>n-1</sup>) ~ +(2<sup>n-1</sup>-1)
 +
| -(1-2<sup>-(n-1)</sup>) ~ +(1-2<sup>-(n-1)</sup>)
 +
|2<sup>n</sup>-1
 +
|-
 +
|反码
 +
| -(2<sup>n-1</sup>-1) ~ +(2<sup>n-1</sup>-1)
 +
| -(1-2<sup>-(n-1)</sup>) ~ +(1-2<sup>-(n-1)</sup>)
 +
|2<sup>n</sup>-1
 +
|-
 +
|补码
 +
| -2<sup>n-1</sup> ~ +(2<sup>n-1</sup>-1)
 +
| -1 ~ +(1-2<sup>-(n-1)</sup>)
 +
|2<sup>n</sup>
 +
|-
 +
|移码
 +
| -2<sup>n-1</sup> ~ +(2<sup>n-1</sup>-1)
 +
| -1 ~ +(1-2<sup>-(n-1)</sup>)
 +
|2<sup>n</sup>
 +
|}
 +
 +
=== 定点整数 ===
 +
以 n=3 为例,代表存取数据的时候以 3 位二进制进行,3 位二进制,每一位都可以取0或1,
 +
{| class="wikitable"
 +
!0/1
 +
!0/1
 +
!0/1
 +
|}
 +
在这种情况下,能表示的数码分别有:
 +
{| class="wikitable"
 +
!0
 +
!0
 +
!0
 +
! rowspan="4" |
 +
!1
 +
!0
 +
!0
 +
|-
 +
!0
 +
!0
 +
!1
 +
!1
 +
!0
 +
!1
 +
|-
 +
!0
 +
!1
 +
!0
 +
!1
 +
!1
 +
!0
 +
|-
 +
!0
 +
!1
 +
!1
 +
!1
 +
!1
 +
!1
 +
|}
 +
 +
2×2×2=8,共8个编码,但因为首位是符号位,所以就表示:
 +
{| class="wikitable"
 +
|+
 +
!表示的数
 +
!符号位
 +
!2<sup>1</sup>
 +
!2<sup>0</sup>
 +
!
 +
!表示的数
 +
!符号位
 +
!2<sup>1</sup>
 +
!2<sup>0</sup>
 +
|-
 +
!+0
 +
!0
 +
!0
 +
!0
 +
! rowspan="4" |
 +
!-0
 +
!1
 +
!0
 +
!0
 +
|-
 +
!+1
 +
!0
 +
!0
 +
!1
 +
!-1
 +
!1
 +
!0
 +
!1
 +
|-
 +
!+2
 +
!0
 +
!1
 +
!0
 +
!-2
 +
!1
 +
!1
 +
!0
 +
|-
 +
!+3
 +
!0
 +
!1
 +
!1
 +
!-3
 +
!1
 +
!1
 +
!1
 +
|}
 +
在原码表示时,出现了+0和-0,它们都是0的编码。
 +
 +
也就是说在原码当中,0有两种表示:一个是+0,一个是-0。
 +
 +
所以表示的就是7(2<sup>n</sup>-1)个数。
 +
 +
当n=8,也就是一共8个数位时:
 +
 +
原码:
 +
 +
-(2<sup>n-1</sup>-1) ~ +(2<sup>n-1</sup>-1)
 +
 +
-127 ~ +127
 +
 +
转为二进制:1111 1111 ~ 0111 1111。
 +
 +
=== 反码 反码是从原码得到的,所以反码的个数、范围和原码是一模一样的。 ===
 +
原码和反码的0都有两个表示形式:+0和-0。
 +
 +
=== 补码 ===
 +
1000 0000 ~ 0111 1111
 +
 +
<u>'''其中 -128 的补码为 1000 0000是人为规定。'''</u>
 +
 +
 +
=== 移码 ===
 +
移码和补码表示范围和表示个数是一致的。
 +
 +
 +
 +
=== 定点小数 ===
 +
以3位定点小数为例:
 +
 +
第一个位置留着作正负号,取值范围最小取000,最大取011。
 +
 +
定死小数点就在第一位后面,所以叫“定点小数”。
 +
{| class="wikitable"
 +
|+定点小数的正数
 +
!
 +
!符号
 +
!这个小数点实际不占位
 +
! colspan="2" |取值
 +
|-
 +
|最小
 +
|0
 +
|.
 +
|0
 +
|0
 +
|-
 +
| rowspan="2" |……
 +
|0
 +
|.
 +
|0
 +
|1
 +
|-
 +
|0
 +
|.
 +
|1
 +
|0
 +
|-
 +
|最大
 +
|0
 +
|.
 +
|1
 +
|1
 +
|}
 +
{| class="wikitable"
 +
|+定点小数的负数
 +
!
 +
!符号
 +
!这个小数点实际不占位
 +
! colspan="2" |取值
 +
|-
 +
|
 +
|1
 +
|.
 +
|0
 +
|0
 +
|-
 +
|
 +
|1
 +
|.
 +
|0
 +
|1
 +
|-
 +
|
 +
|1
 +
|.
 +
|1
 +
|0
 +
|-
 +
|
 +
|1
 +
|.
 +
|1
 +
|1
 +
|}
 +
像补码一样,定点小数的100人为定义为-1。
 +
 +
在定点小数当中,补码和移码的表示范围是从-1开始的。
 +
 +
 +
=== 例题 ===
 +
采用n位补码(包含一个符号位)表示数据,可以直接表示数值()。
 +
 +
A、2<sup>n</sup>
 +
 +
B、-2<sup>n</sup>
 +
 +
C、2<sup>n-1</sup>
 +
 +
D、-2<sup>n-1  √</sup>
 +
 +
解:
 +
 +
n位补码可以表示的数值范围是-2<sup>n-1</sup> ~ 2<sup>n-1</sup>-1,人为定义 10……0 的值是 -2<sup>n-1</sup>。
 +
 +
=== 例题 ===
 +
如果“2X”的补码是“90H”,那么X的真值是()。
 +
 +
A、72
 +
 +
B、-56 √
 +
 +
C、56
 +
 +
D、111
 +
 +
解:
 +
 +
“90H”是一个<u>十六进制</u>数;
 +
 +
给出的供选择的答案是<u>十进制</u>;
 +
 +
补码又是针对<u>二进制</u>的;
 +
 +
那么先把“90H”转成二进制,十六进制转二进制1位变4位,就是"1001 0000",
 +
 +
但"1001 0000"是补码,还要再转成原码,需要先转成反码,转成反码需要-1(因为<u>补码是反码+1</u>),就是“1000 1111”(反码),
 +
 +
再转成原码,符号位不变,其他位取反就是“1111 0000”(因为<u>原码转反码是符号不变,其他位按位取反</u>),然后左边第一位是符号位,
 +
 +
后面7位是数值位“111 0000”,转十进制是1×2<sup>6</sup>+1×<sup>5</sup>+1×<sup>4</sup>=64+32+16=112,
 +
 +
加上符号位就是-112,最后再除以2,得到X=-56。

2024年3月18日 (一) 14:21的最新版本

https://www.bilibili.com/video/BV13U4y1E7oA/?p=5

考点2:码制(原码/反码/补码/移码)

原码:最高位是符号位,其余低位表示数值的绝对值。

比如:

0 0 0 0 0 0 0 1
其余低位
数值1(正1) 数值-1(负1) 1-1(也就是1+(-1))
原码 0000 0001 1000 0001 1000 0010

1+(-1)=0,在原码形式中,用1的原码加-1的原码:

0000 0001+ 1000 0001=1000 0010,符号位是1,表示负号,数值位绝对值是2,是-2,所以在计算机中做具体运算时,并不使用源码进行运算。

实际用补码进行加减、运算


反码:正数的反码与原码相同,负数的反码是其绝对值按位取反(符号位不变)。

数值1(正1) 数值-1(负1) 1-1(也就是1+(-1))
原码 0000 0001 1000 0001 1000 0010
反码 0000 0001 1111 1110 1111 1111

正1的反码和负1的反码相加是:0000 0001+1111 1110=1111 1111,从反码来看,符号位不变,其他位按位取反,得到的原码就是1000 0000,也就是-0。

真正记数的时候,只有一个0,没有负0的说法。


为什么说补码运算是正确的呢?

数值1(正1) 数值-1(负1) 1-1(也就是1+(-1))
原码 0000 0001 1000 0001 1000 0010
反码 0000 0001 1111 1110 1111 1111
补码 0000 0001 1111 1111 (1) 0000 0000

补码:正数的补码与源码相同,负数的补码是其反码的基础上末位加1(符号位不变)。

正1的补码和负1的补码相加是:0000 0001+1111 1111=(1) 0000 0000,但是计算机取固定8位字长,进位的1就被丢弃掉了,得到后面的 0000 0000。

通过符号位来看,是一个正数,它的数值位——正数的原码、反码、补码都是一样的。0000 0000就是0。


移码:补码的基础上符号位按位取反

数值1 数值-1 1-1(也就是1+(-1))
原码 0000 0001 1000 0001 1000 0010
反码 0000 0001 1111 1110 1111 1111
补码 0000 0001 1111 1111 0000 0000
移码 1000 0001 0111 1111 1000 0000

09:05

注: n 表示字长
码制 定点整数 定点小数 数码个数
原码 -(2n-1) ~ +(2n-1-1) -(1-2-(n-1)) ~ +(1-2-(n-1) 2n-1
反码 -(2n-1-1) ~ +(2n-1-1) -(1-2-(n-1)) ~ +(1-2-(n-1)) 2n-1
补码 -2n-1 ~ +(2n-1-1) -1 ~ +(1-2-(n-1)) 2n
移码 -2n-1 ~ +(2n-1-1) -1 ~ +(1-2-(n-1)) 2n

定点整数

以 n=3 为例,代表存取数据的时候以 3 位二进制进行,3 位二进制,每一位都可以取0或1,

0/1 0/1 0/1

在这种情况下,能表示的数码分别有:

0 0 0 1 0 0
0 0 1 1 0 1
0 1 0 1 1 0
0 1 1 1 1 1

2×2×2=8,共8个编码,但因为首位是符号位,所以就表示:

表示的数 符号位 21 20 表示的数 符号位 21 20
+0 0 0 0 -0 1 0 0
+1 0 0 1 -1 1 0 1
+2 0 1 0 -2 1 1 0
+3 0 1 1 -3 1 1 1

在原码表示时,出现了+0和-0,它们都是0的编码。

也就是说在原码当中,0有两种表示:一个是+0,一个是-0。

所以表示的就是7(2n-1)个数。

当n=8,也就是一共8个数位时:

原码:

-(2n-1-1) ~ +(2n-1-1)

-127 ~ +127

转为二进制:1111 1111 ~ 0111 1111。

反码 反码是从原码得到的,所以反码的个数、范围和原码是一模一样的。

原码和反码的0都有两个表示形式:+0和-0。

补码

1000 0000 ~ 0111 1111

其中 -128 的补码为 1000 0000是人为规定。


移码

移码和补码表示范围和表示个数是一致的。


定点小数

以3位定点小数为例:

第一个位置留着作正负号,取值范围最小取000,最大取011。

定死小数点就在第一位后面,所以叫“定点小数”。

定点小数的正数
符号 这个小数点实际不占位 取值
最小 0 . 0 0
…… 0 . 0 1
0 . 1 0
最大 0 . 1 1
定点小数的负数
符号 这个小数点实际不占位 取值
1 . 0 0
1 . 0 1
1 . 1 0
1 . 1 1

像补码一样,定点小数的100人为定义为-1。

在定点小数当中,补码和移码的表示范围是从-1开始的。


例题

采用n位补码(包含一个符号位)表示数据,可以直接表示数值()。

A、2n

B、-2n

C、2n-1

D、-2n-1 √

解:

n位补码可以表示的数值范围是-2n-1 ~ 2n-1-1,人为定义 10……0 的值是 -2n-1

例题

如果“2X”的补码是“90H”,那么X的真值是()。

A、72

B、-56 √

C、56

D、111

解:

“90H”是一个十六进制数;

给出的供选择的答案是十进制

补码又是针对二进制的;

那么先把“90H”转成二进制,十六进制转二进制1位变4位,就是"1001 0000",

但"1001 0000"是补码,还要再转成原码,需要先转成反码,转成反码需要-1(因为补码是反码+1),就是“1000 1111”(反码),

再转成原码,符号位不变,其他位取反就是“1111 0000”(因为原码转反码是符号不变,其他位按位取反),然后左边第一位是符号位,

后面7位是数值位“111 0000”,转十进制是1×26+1×5+1×4=64+32+16=112,

加上符号位就是-112,最后再除以2,得到X=-56。