补码的加减乘除和移位
来源:互联网 发布:vmware pro mac os x 编辑:程序博客网 时间:2024/06/07 10:09
我们知道计算机的符号数有三种表示方法:原码,反码和补码。它们分为符号位和数值位,通常符号位为最高位,且0表示正,1表示负。注意符号位在移位时是不变的,在取补码时是变的。且正数补码等于原码。
以-3为例求补码:
3的原码是0b0011
反码是0b1100(所有位取反)
补码是0b1101(反码+1)
补码加法:
[X+Y]补 = [X]补 + [Y]补
例如X= +0011 0011 = 51, Y = -0010 1001 = -41
[X]补 = 0011 0011, [Y]补 = 1101 0111
[X+Y]补 = [X]补 + [Y]补 = 0011 0011+1101 0111 = 0000 1010= 10
补码减法:
[X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补
例如1 - 1 = 1 + (-1),与补码加法类似,相信大家能理解。
补码乘法:
机器只能进行正数运算,因此当x为负数时,就将它变为正(负数的补码),即[X*Y]补== 【[X]补】补 × [Y]补,所得结果再取补码
例如原码x = -0011 = -3, y= +0011 = +3
[X]补 = 1101,【[X]补】补= 0011
[x*y]补 = [0011 * 0011] 补= [01001]补 = 10111 = -01001 = -9
补码除法:
[X/Y]补 = [X]补 / [Y]补
例如原码x = -0011 = -3, y= +0011 = +3,同样负数要变为正
[X]补 = 1101,【[X]补】补= 0011, [Y]补 = 0011
[X/Y]补 = [0011 / 0011]补 = 1111 = -1
补码移位:
符号位在移位时是不变的,正数左右移位都补0,负数向右移位空出来的位补1,左移空出来的位补0。
例如x = -0001 = 1111,
右移1位(相当于除以2)是1111 = -0001 = -1,因为1除以2余1
左移1位(相当于乘以2)是1110 = -0010 = -2
为什么负数向右移位空出来的位补1,左移空出来的位补0呢?
笔者的理解如下:先把负数取补码(变为正数),正数右移一位相当于除以2,此时补0,最高位便是0,再取补码,最高位变为1,因此负数补码右移要补1。而正数左移一位相当于乘以2,此时补0,最低位便是0,再取补码(取反并加1),最低位变为0,因此负数补码左移要补0。
笔者对补码也是刚开始思考,也许会有错误,欢迎各路大神勘误,不胜感激
0 0
- 补码的加减乘除和移位
- 补码表示法和负数的移位
- 补码表示法和负数的移位
- 补码的移位计算除法
- 补码表示的大数加减乘除运算程序设计
- 原码、反码、补码、负数的移位
- 关于原码,反码,补码和左右移位的若干思考
- 关于原码,反码,补码和左右移位的若干思考
- 关于原码,反码,补码和左右移位的若干思考
- 二进制移位实现加减乘除
- 计算机中原码,反码和补码和移位操作
- C语言移位运算的优先级低于加减乘除
- 补码与移位
- 补码移位乘法运算
- js的移位运算以及二进制补码反码的计算方法
- JAVA中补码的运算;移位运算符
- 1的补码和2的补码
- 二进制补码及与移位
- 【PAT甲级】【C++】1003. Emergency (25)
- 异步任务-AsyncTack基本使用
- MySQL ibdata1瘦身
- 单向链表的插入排序
- Matlab 中 arrayfun用法
- 补码的加减乘除和移位
- 第24篇 linux下布署apprtc(二)
- 由swr_get_delay想到的
- 51NOD 1065 最小正子段和
- Spring源码阅读(2)- bean解析初体验
- wn_遥远的村下
- (九)修改和删除部门功能模块的实现
- Adb学习
- iOS控件之UIResponder