正负数的原码、反码、补码

原码、反码以及补码都是有符号的,其中最高位存放符号位,0 表示正数,1 则 表示负数。

对于正数来说 : 原码=反码=补码,而负数我们需要计算。

源码:最高位表示正负,其余位表示数值。例如十进制的正负 1,用 8 位二进制 的原码表示:

+1 = [0000 0001]原

-1 = [1000 0001]原

反码:正数的反码和原码相同;负数的反码是在原码的基础上,符号位不变, 其余位按位取反。

+1 = [0000 0001]反

-1 = [1111 1110]反

以下是一些关于原码、反码和补码的基本知识:

  • 原码:正数的原码就是其本身,负数的原码为其对应正数的补码按位取反。
  • 反码:正数的反码就是其本身,负数的反码为其对应正数的原码按位取反加1。
  • 补码:正数的补码就是其本身,负数的补码为其对应正数的反码按位取反加1

+1 = [0000 0001]补

-1 = [1111 1111]补

为什么用补码存储整数数据?

我们人脑可以知道最高位是符号位,在计算的时候就会根据符号位进行加减, 但是对于计算机,加减乘除已经是最基础的运算,因此要设计得尽量简单,而 让计算机辨别符号位会让计算机的基础电路设计变得复杂。于是人们开始探索 将符号位参与运算,并只保留加法的方法,根据运算法则,减去一个数等于加 上这个数的负数,即 1 - 1 = 1 + (-1)

使用原码运算

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [1000 0010]原 = -2

使用原码计算 1 - 1 的结果是 -2 。所以让符号位也参与运算时,使用原码,对 于减法运算来说,结果是不正确的。这也是计算机内存在存储数据时不使用原 码的原因。为了解决这一问题,就出现了反码。

使用反码运算

1 - 1 = 1 + (-1) = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 000]原 = -0

使用反码的问题在于 0 的符号是负号,而且 [0000 0000]原 和 [1000 0000]原 都表示 0。为了解决这一问题,就出现了补码。

使用补码运算

1 - 1 = 1 + (-1) = [0000 0001]补 + [1111 1111]补 = 1(舍去) [0000 0000]反 = [0000 0000]原 = 0

这样就不存在 -0 的问题了。

现在,你该知道为什么用补码存储整数数据了吧

一、正数

二、负数

  • 负数的反码是将其原码中,除符号位以外,每一位取反。例如,对于一个8位二进制数,如果它的最高位为1,则它是负数。除了第一位外

  • 负数的补码是在其反码的基础上加1得到的

 三、计算  -5&6

四、左移

公式:m<<n = m*(2^n)

  1. 计算6<<2的结果
  2. 将6转换为32为二进制
  3. 把二进制左移两位,空出位补0
  4. 然后转换为十进制就是24

五、右移

公式:m>>n = m/(2^n)

  1. 计算12>>2的结果
  2. 将12转换为32位二进制
  3. 二进制右移空出的高位补上最高位的数字
  4. 转换为十进制就是3

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值