补码、二进制的减法

补码、二进制的减法有关二进制的负数及减法运算二进制数表示方法:原码反码补码二进制减法运算法则:**二进制数表示方法:**无符号二进制数(正数)(8位)(能够表示的十进制数范围0-255)举例:10(8’b0000_1010)100(8’b0110_0100)255(8’b1111_1111)有符号二进制数(正数负数)(8位)(能够表示的十进制数范围-128~127)举例…

大家好,又见面了,我是你们的朋友全栈君。

**

二进制数表示方法:

**
无符号二进制数(正数)(8位)(能够表示的十进制数范围 0-255 )
举例: 10(8’b0000_1010) 100(8’b0110_0100) 255(8’b1111_1111)

有符号二进制数(正数 负数)(8位)(能够表示的十进制数范围 -128 ~ 127)
举例: 10(8’b0000_1010) 100(8’b0110_0100) 255(8’b1111_1111)
举例:-10(8‘b1000_1010) -100(8’b1110_0100) -127(8’b1111_1111)

**

原码反码补码

**
计算机存储和运算过程中一般会用到原码,反码和补码
下面以8位二进制机器码举例说明:
原码:最高位代表符号位,其余位为数值的绝对值
如:+8 (8’b0000_1000) -8(8’b1000_1000)
反码:存储时正数的反码与原码相同,负数的反码符号位保持不变,其余位数按位取反
如:+8 (8’b0000_1000) -8(8’b1111_1000)
补码:存储时正数的补码与原码相同,负数的补码在反码的最低位+1得到
如:+8 (8’b0000_1000) -8(8’b1111_1001)

举例:分别写出+3和-3的原码,反码和补码
在这里插入图片描述
**

二进制减法运算法则:

**
在做减法之前,我们首先来看一下,如果没有定义位宽(二进制的位数),那么我们要在参与运算的数值及结果中取一个最大的绝对值,找到能够表示此绝对值的二进制数位宽并+1.
例如:
100+50 = 150 当我们计算100+50时, 定义为宽最小为8位(无符号)或9位(有符号)或更大也可
100-50 = 50 定义为宽最小8位 (有符号)或更大也可
50-100 = -50 定义为宽最小为8位(有符号)或更大也可
-50-100 = -150 定义为宽最小为9位(有符号)或更大也可

接下来我们来看减法运算
例1: 100-50
由于7位2进制最大表示128,则要表示100最少需要7位,但由于涉及减法运算,所以加一位符号位用8位表示。

100的8位二进制为 8‘b0,110_0100; (红色表示符号位)
-50的8位二进制为 8‘b1,011_0010; 反码(为了计算补码)为8‘b1,100_1101 补码:8‘b1,100_1110
实际运算过程为两个二进制补码相加;(可以理解为100+(-50))
在这里插入图片描述
由于是8位计算,最后的进位舍去,得到二进制8‘b0,011_0010 = 50(D)

例2: -100-50
由于运算结果为-150 绝对值150最大,7位2进制数最大只能表示128,因此需要8位表示150,又因为是有符号运算,因此至少要用9位去表示-150。

-100的8位二进制为 9‘b1,0110_0100; 反码为9‘b1,1001_1011 补码:9‘b1,1001_1100
-50的8位二进制为 9‘b1,0011_0010; 反码为9‘b1,1100_1101 补码:9‘b1,1100_1110
实际运算过程为两个二进制补码相加;(可以理解为(-100)+(-50))
在这里插入图片描述
此时我们得到一个负数9‘b1,0110_1010,但是不要忘记,负数的存储是以补码形式存储的,我们需要把它转化为原码,因为我们太熟悉原码了。

求原码的过程和求反码正好相反,首先减一,得到反码,对反码再求反码,得到原码:
负数9‘b1,0110_1010的反码是9‘b1,0110_1001,原码是9‘b1,1001_0110。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150281.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 时间戳格式化「建议收藏」

    时间戳格式化「建议收藏」须知:1. 时间戳分2种,一种是10位的,只包含年月日时分秒,也就是说,只精确到秒。一种是13位的,包含毫秒。这2种都叫时间戳,并不是只有精确到毫秒的才叫时间戳。10位时间戳就是从1970-01-01到当前的秒数,注意,不是毫秒数,所以需要按毫秒解析时,要*100013位时间戳就是从1970-01-01到当前的毫秒数,在java中用Instant对象对应。2. timestamp的格式化串用大写的S来表示毫秒数。S的个数和毫秒的位数严格对应,否则报错。如果规范中要求精确到毫秒,那么给的时间字符串

  • .gitkeep

    .gitkeep

    2021年10月20日
  • ORACLE 存储过程死锁[通俗易懂]

    ORACLE 存储过程死锁[通俗易懂]/**问题描述:在编译某个存储过程时,由于没提交或断网或者TEST没停止又重新编译,导致编译存过一直卡死问题分析:存储过程或某张表被锁例如:存储过程p_BonusMID死锁,表现的现象是在编译时无响应。**/–首先使用下面语句查询存过(存储过程)p_BonusMID的进程SELECT*FROMV$DB_OBJECT_CACHEWHEREname=UPPER(‘

  • Java基础篇:equals()方法与==的区别

    Java基础篇:equals()方法与==的区别

  • 大学四年,我把私藏的自学「学习网站/实用工具」都贡献出来了

    大学四年,我把私藏的自学「学习网站/实用工具」都贡献出来了在分享之前,先说说初学者如何学习编程,这个话题想必非常的重要,要学好编程,给你一些学习网站也好、实用工具也好,但前提是你知道如何去学习它。见过很多初学者,以及小鹿我刚开始学习的时候,也是自己瞎摸索,找不到路子,看什么书?看什么资料?编程的方向太多了,如果确定自己的方向?尤其是上大一、大二甚至大三还没有确定自己到底是学习前端还是后天,每天这学一点,那学一块,掌握那么多,没有一门精通的,去面试的时候…

  • ORACLE函数之日期时间运算函数[通俗易懂]

    ORACLE函数之日期时间运算函数

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号