十进制转二进制
正整数转二进制,这个简单,除2取余,倒着写。
容易忽略的是小数,乘2取整,正着写。
负数的话,在计算机中要用补码,因为计算机中加减乘除都得用加法。
机器数与真值
把符号“数字化”的数称为机器数。
把带“+”或“-”符号的数称为真值。
原码、反码、补码
正数最简单,原码、反码、补码都一样。
例:
真值:+1110(已经二进制)
原码:01110(0表示符号为正)
反码:01110
补码:01110
负数复杂一点,
例1:
真值:-1110(已经二进制)
原码:11110(1表示符号为负)
反码:10001(符号位不变)
补码:10010(取反加1)
例2:
真值:-0.1101(已经二进制)
原码:1.1101(由1-(-0.1101)得到,其实就是“-0”换成1)
反码:1.0010(符号位不变)
补码:1.0011(取反加1)
注意:
[+0.0000]原=0.0000
[+0.0000]反=0.0000
[+0.0000]补=0.0000
[-0.0000]原=1.0000
[-0.0000]反=1.1111
[-0.0000]补=0.0000
顺便说一说BCD码
它是用4个二进制表示一个十进制,24=16,所以表示十进制时有6个剩余,只需从
0000-1111 (16个)中选10个即可表示十进制。
8421码:0000-1001
2421码:0000-1111、0001-1110…它是一对一对的,这样选10个
余3码:0011-1100 前后各去3个,也是对称的。
数的定点表示与浮点表示
定点:
浮点:
直接通过例子说明:将-54表示成二进制定点数和浮点数。设浮点数字长16位,其中阶码5位(含1位阶位),尾数11位(含1位数符)。
定点机中:
真值:-110110
原码:10000110110(符号1位负,数值10位)
反码:11111001001
补码:11111001010
***浮点机中:***(类笔着科学计数法来想)
浮点数表示:-0000110110
规格化:-(0.1101100000)x 2110 (注意:110是二进制,即右移6位才和原来相等)
这样阶码、尾数就有了。
原码:0,0110;1.1101100000
反码:0,0110;1.0010011111
补码:0,0110;1.0010100000
补充:
同样以n=10;m=4,阶符和数符各取1位。
IEEE 754标准
阶码的真值都被加上一个常数。短实数加7FH,长实数加3FFH。临时实数加3FFFH。
例:
数值:178.125
二进制:10110010.001
浮点表示:1.0110010001 x 2111 (1.xxx的形式,最后表示时,省略(不写)那个1)
此时的阶码是:00000111,加上01111111(7FH)得10000110:
短实数表示为 10000110 01100100010000000000000(总的31位)
注意: 逆推的时候得记得加上1.xxx
定点运算
加法与减法运算
整数:[A]补+[B]补=[A+B]补(mod 2n+1)
小数:[A]补+[B]补=[A+B]补(mod 2)
整数:[A-B]补=[A]补+[-B]补(mod 2n+1)
小数:[A-B]补=[A]补+[-B]补(mod 2)
例1:
A=0.1011,B=-0.0101,求[A+B]补
[A]补=0.1011,[B]补=1.1011
[A+B]补=0.0110
例2:
A=+15,B=+24,求[A-B]补
[A]补=0,0001111,
[B]补=0,0011000,[-B]补=1,1101000 ([B]补连着符号位取反加1)
[A-B]补=1,1110111
由上可知:不论操作数是正还是负,在做补码加减法时,只需将符号位和数值部分一起参加运算并且将符号位产生的进为自然丢弃即可
溢出
-
不论是做加法还是减法,只要两个操作数的符号相同,而结果又与原操作数符号不同,即为溢出。
也就是将符号位产生的进位与最高有效位产生的进位异或操作,1则溢出,0则没有溢出。 -
变形补码(2位符号位)
当两位符号位不同时表示溢出,否则;无溢出。“10”表示负溢出;“01”表示正溢出。例1:
x=+11/16 , y=+3/16
[x]补=00.1011;[y]补=00.0011;
[x+y]补=00.1110 (00相同,无溢出)
x+y=0.1110例2:
x=-11/16 , y=-7/16
[x]补=11.0101;[y]补=11.1001;
[x]补+[y]补=10.1110;(10不同,负溢出)
浮点运算
加法与减法运算
- 对阶
- 尾数求和
- 规格化
左规:尾数的第一数值为与符号位相同需左规,尾数左移一位,阶码减1.
右规:符号位不相同需右规,尾数右移一位,阶码加1. - 舍入
- 溢出
例1:
x=0.1101 x 201 ,y=(-0.1010) x 211,求x+y。
[x]补=00,01;00.1101
[y]补=00,11;11.0110
-
小阶向大阶看齐
显然,要将x变为211 ,每右移一位,阶码加1
[x]补=00,11;00.0011 -
尾数求和
00.0011+11.0110=11.1001
即[x+y]补=00,11;11.1001 -
规格化
左规:
[x+y]补=00,10;11.0010故x+y=(-0.1110) x 210
例2:
x=0.1101 x 210 ,y=0.1011 x 201,求x+y。
[x]补=00,10;00.1101
[y]补=00,01;11.1011
-
小阶向大阶看齐
显然,要将y变为210 ,每右移一位,阶码加1
[y]补=00,10;00.0101 -
尾数求和
00.1101+00.0101=01.0010
即[x+y]补=00,10;01.0010 -
规格化
右规:
[x+y]补=00,11;00.1001故x+y=0.1001 x 211