互联网行业 算法研发工程师
全文概括:
本讲介绍了定点数的编码表示,主要包括原码、补码和移码。
原码表示方式简单,正数用0表示,负数用1表示,但存在表示不唯一和加减运算不统一的问题。
补码表示方式解决了这些问题,正数的补码与原码相同,负数的补码:是其原码取反再加1。
模运算系统种,可以用加法代替减法。比如:10-4,就等于,10+8(-4的补码)。
-1928的补码,等于模减去这个数的绝对值,也就是10的4次方,减去1928。
因为:一个负数的补码,等于模减去这个数的绝对值。
4位10进制的模,就是0000---9999,一共10的4次方个数,也就是10的4次。
17900除以10000,得到的余数,就是7900。在这个模运算中,7900,就是与17900等价的一个数。
计算机内部的 表示,就是用2进制来实现的,就像是一个2进制的算盘(只能拨0和1)。
2的8次方 二进制表示(1后面8个0):1 0000 0000。
1 0000 0000 - 0100 0000 = 1100 0000.
因此,一个负数【- 0100 0000】的补码,等于对应正数补码的各位取反,末尾加1。【1100 0000】。
一道题
假定补码位数为8,-1000这个二进制数的补码表示为( )。
- 十进制的 8 转换为二进制是 1000(4 位)。
- 填充为 8 位:
- 为了将其表示为 8 位,前面需要补充 0:
- 所以,8 的 8 位二进制表示为 00001000。
所以,正数的补码还是它本身,因为除以模取余数,还是它。
负数的补码,就是模减去这个数的绝对值。
举例:-8,它的补码是多少?
-8是真值,就是2的4次方(1 0000),减去8(1000)。结果是:01000。
下列文章小结:
补码的定义和计算方法。
对于正数的补码表示,直接将数值部分照抄即可;
对于负数的补码表示,将数值部分各位取反末尾加一。
补码的计算可以用公式带入求解,也可以用简便方法从右往左找到第一个1前面的各位取反。
补码的表示可以用于存放中间结果,即使发生溢出也可以用变形补码表示。
正零和负零的补码表示是一样的。
最后,通过例子演示了如何根据补码求出真正的值。
10...01...0=1...0 (n-1个零)
-0的补码,还是00....00【n个0】,因为(2的次方【10...0,n个0】-0还是模本身,然后再除以模,等于又去掉了最高位,所以,还是000....00【n个0】)
负数是以原码的补码形式表达的!!!!!
比如,对于32位表示的-1,它的机器数是多少?
1 0000 0000 0000 0000 0000 0000 0000 0000
- 0000 0000 0000 0000 0000 0000 0000 0001
= 1111 1111 1111 1111 1111 1111 1111 1111【答案】
解析:
进一步的,转换为16进制,就是85H。
1.通过二进制转十进制,十进制再转16进制的方法,间接实现二进制转16进制的过程
1111 = 8 + 4 + 2 + 1 = 15 =F
1110 = 8 + 4 + 2 + 0 = 14= E
1101 = 8 + 4 + 0 + 1 = 13= D
1100 = 8 + 4 + 0 + 0 = 12 =C
1011 = 8 + 0 + 2 + 1 = 11= B
1010 = 8 + 0 + 2 + 0 = 10 =A
1001 = 8 + 0 + 0 + 1 =9 =9
……
0001 = 0 + 0 + 0 + 1 = 1= 1
0000 = 0 + 0 + 0 + 0 = 0= 0
2.二进制转十六进制
有1得出
1111 1101 , 1010 0101 , 1001 1011
F D , A 5 , 9 B
根据补码各位上的“权”,可以求出一个补码的值。
因为补码的最高位是1表示负数,所以,要✖(-1)。-0和0一样,所以就在公式的最前面直接加了一个负号。
1101 0110,这个第一位是1,表示是负数,它的真值怎么算呢?
因为它是由原码的各位取反,末尾加1得到的,因此,可以先减去1,然后各位取反,就得到了:
0010 1010,换算为10进制,就是32+8+2=42。再把负号加上,就是-42。