原码、反码、补码及减法运算

举报
彭世瑜 发表于 2021/08/13 22:54:12 2021/08/13
【摘要】 负数采用补码的形式表示,这是为了硬件操作的方便,把减法也转换成加法来运算 引入反码、补码是为了解决减法的问题,换句话数就是解决负数的问题,正数不存在这些问题,所以它的反码补码就是它本身 正数的反码、补码都为本身有符号的基本数据类型中,最高位0表示正数,最高位1表示负数对于负数来讲,它的反码就是除去符号位取反,然后加1就得到了它的补码 1、原码与反码转换 公式 ...

负数采用补码的形式表示,这是为了硬件操作的方便,把减法也转换成加法来运算

引入反码、补码是为了解决减法的问题,换句话数就是解决负数的问题,正数不存在这些问题,所以它的反码补码就是它本身

  1. 正数的反码、补码都为本身
  2. 有符号的基本数据类型中,最高位0表示正数,最高位1表示负数
  3. 对于负数来讲,它的反码就是除去符号位取反,然后加1就得到了它的补码

1、原码与反码转换

公式

原码 => 反码 = 符号位不变,数值位分别“按位取反”
反码 => 原码 = 符号位不变,数值位分别“按位取反”

  
 
  • 1
  • 2

eg:

-3
= 10000011  原码
=>11111100  反码
=>10000011  原码 

  
 
  • 1
  • 2
  • 3
  • 4

2、原码与补码转换

公式

原码 => 补码 = 反码 + 1 
补码 => 原码 = (补码 -1)取反码 = 补码的反码 + 1
补码的补码等于原码

  
 
  • 1
  • 2
  • 3

eg:

-3
=10000011 原码
=11111100 反码
=11111101 补码
=11111100 补码-1
=10000011 (补码-1)取反码 == 原码

或者
=11111101 补码
=10000010 补码的反码
=10000011 补码的补码

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

补码的补码等于原码

例如:

byte型数据1个字节占8位

-7可以表示为10000111,最高位的1代表负号,它的反码是除去符号位各位取反为11111000,然后加1得到补码11111001

8的二进制表示为00001000

现在我们运算 8 - 7,在计算机并不是用8减去7,而是用8 + (-7),

也就是用00001000加上-7的补码11111001,两个有符号数相加,
如果符号位相加有近位就删去符号位的进位,得到00000001,也就是1.

-7 =》 0B10000111 => 反码0B11111000 => 补码0B11111001

8 - 7
= 8 + (-7)
= 0B00001000 + 0B11111001
= 0B00000001
= 1

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

参考

  1. java中负数表示
  2. 原码与补码的转换

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/107355782

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。