数据表示
◆带符号数有下列编码方式,当真值为-45时:
原码:一个数的正常二进制表示,最高位表示符号,数值 0 的源码有两种形式:+0 (00000000)和-0 (1 0000000) 。-45对应原码为10101101
反码:正数的反码即原码;负数的反码是在原码的基础上,除符号位外,其他各位按位取反。数值 0 的反码也有两种形式: +0 (00000000) , -0 (1 1111111)-45 对应反码为 11010010
补码:正数的补码即原码;负数的补码是在原码的基础上,除符号位外,其他各位按位取反,而后末位+1(反码+1),若有进位则产生进位。因此数值 0 的补码只有一种,形式+0= -0= 0 0000000。-45对应补码为11010011
移码:用作浮点运算的阶码,无论正数负数,都是将补码的首位(符号位)取反得到移码。-45对应移码为01010011
取值范围
机器字长为 n 时各种码制表示的带符号数的取值范围(差别在于 0 的表示,原码和反码分 +0和 -0,补码只有一个 0 ,因此可以多表示一个。)
取值范围是有规则的,按照规则来记忆更加简单:
首先需要知道,原码和反码包含 +0 和 -0 ,补码和移码只包含 +0
机器字长为 n 位,其中第一位是符号位,所以实际的数值位为 n-1 ,由于是二进制,所以能表示的数据范围是 2^n-1
对于原码和反码来说,负数范围是 -(2^n-1)-1 ~ -0 ,正数范围是 +0 ~ +(2^n-1)-1,所以原码和反码定点整数的数据范围就是 -(2^n-1)-1 ~ +(2^n-1)-1
对于补码和移码来说,负数的范围是 -(2^n-1) ~ -1 ,正数的范围是 +0 ~ +(2^n-1)-1, 所以补码和移码定点整数的数据范围就是 -(2^n-1) ~ +(2^n-1)-1
定点小数的数据范围就是定点整数的数据范围除以 2^n-1
小练习
接下来通过两个在软考当中出现的真题来练习
如果“2X”的补码是“90H”,那么x的真值是()
A.72 B.-56 C.56 D. 111
答案:B
解析:这里主要是考察补码的表示,补码中无正负之分,符号位作为数值参与计数。2x 的补码90H 转换为二进制为 10010000 ,可知最高位符号位为 1 ,也就是负数,按照负数转化为补码规则(先取反后加1),求真值应该逆向转化即对补码先 -1 再取反,得出2x的源码为 1111 0000 ,在真值中区分正负,最高位作为符号独立显示,不参与计数(与补码的区别),因此为 -1110000=-112 , X 就是 -56.
补充说明:浮点数:表示方法为N =F* 2^E,其中E称为阶码,F称为尾数;类似于十进制的科学计数法,如85.125 =0.85125*10^2,二进制如101.011 =0.101011*2^3.在浮点数的表示中,阶码为带符号的纯整数,尾数为带符号的纯小数,要注意符号占最高位(正数 0 负数 1 ),其表示格式如下
解析:浮点数可以表示为 m*2^n ,其中 m 是尾数(纯小数),n 是阶码(纯整数),要知道浮点数 m*2^n 的取值范围,就需要分别知道 m 和 n 的取值范围
尾数用补码表示,所以需要知道补码小数的取值范围是多少,根据 取值范围 那里提到的推理方法,可以知道补码小数的取值范围是 -1 ~ 1-(2^-(n-1)) ,n 是带有符号位的,所以尾数的数位为 数符 + 尾数 = 9,得到尾数的取值范围是 -1~ 1-(2^-8)
阶码用移码表示,所以需要知道移码整数的取值范围是多少,根据 取值范围 那里提到的推理方法,可以知道移码整数的取值范围是 -(2^n-1) ~ (2^n-1)-1 ,n 是带有符号位的,所以阶码的数位为 阶符 + 阶码 = 7,得到阶码的取值范围是 -64 ~ 63
得到尾数和阶码的范围后,很容易就能推出浮点数 m*2^n 的取值范围,答案是 B