“软件设计师精讲 数据的表示 码制”的版本间的差异
Jihongchang(讨论 | 贡献) (→移码) |
Jihongchang(讨论 | 贡献) (→例题) |
||
(未显示同一用户的7个中间版本) | |||
第269行: | 第269行: | ||
=== 定点小数 === | === 定点小数 === | ||
+ | 以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
码制 | 定点整数 | 定点小数 | 数码个数 |
---|---|---|---|
原码 | -(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。