谈一下源码、转码、补码之间的转换,以及补码是怎么回事。

前言:最近看源码接触了一些二进制运算的问题,为了搞清楚这些问题花费了一些不必要的时间,所以在此做一些笔记和总结方便自己后面回顾, 同时也希望能够帮助到想了解相关知识面的码友。(注意:文章的内容来个人的理解,作者水平有限,如有发现错误,请联系作者及时进行纠正,万分感谢!)

学习转化前必须要先弄明白的概念:

补位机制:计算机中用于存储容量的单位是字节,一个字节等于8比特位,所以比特位常常以8、16、32、64位的形式出现,当数值转化时位数不够时会自动用0来补位。 例如,存储单位是1个字节时(比如byte类型就是一个字节),1的十进制转2进制还是1,位数不够用0来凑,二进制的表现形式就为00000001。

符号位: 位数的第一位就是符号位,0表示正数,1表示复数。注意原码的表示中不一定会用到符号位。

原码: 按照绝对值大小转为二进制,经过补位机制和符号位机制处理过(会有无符号位的原码)的就是原码。

反码: 将二进制按位取反,符号位不参与运算,所得的新二进制称为原二进制的反码。

补码: 在反码的基础上加上1这个操作称为补码。

注意:正数没有反码和补码的概念,反码和补码是针对负数来说的,或者说正数的反码和补码就是原码,三者没有任何区别。

情况:

计算机中原码表示会分为有符号位和无符位两种情况,无符号位表示数字范围为0-255,有符号位表示的数字范围为-128到+127。 无符号类型所有位数上的数都用来表示数值的大小,所以没有复数之说。有符号类型,头一位数作为符号数,用来表示数字的正负, 其他数用来表示数值的大小,并且负数转化的时候是要经过反码和补码的操作才是真正的“原码”。

问题: 为什么原码有符号位数字表示的范围为-127到+128之见呢?  

当原码采用符号位来表示正负的时候会出现一个问题,就是数值为0转为二进制的时候,0的正负数都是一个值, 所以当符号位用来表示0是正数还是负数的时候就已经失去了它的意义,不符合编码映射的唯一性,还浪费了一个二进制的可表示空间。 为了解决这个问题并为了兼顾编码映射的规律性,数学家们找了一个更合适表示数的数字范围,那就是-128到+127。原先用来表示-0的 10000000用来作为-128的表示了,由此递增,数值也慢慢变大(10000001所表示的数值是-127,10000002所表示的数值是-126), 也保证了其规律性。但因为原本表示-0原码被替换,所以当负数转成原码的时候就需要进行一次“补码”操作(为什么需要补码?减了一个数值表示值-0)。

负数转为原码的方法(正数只有原码一种形态,所以主要讲解负数的原码转换):

主要方法有两种,区别是否使用符号位来运算。 举个例子: 举例数值为-1 第一种先添加符号位: 原码:10000001 反码:11111110 补码:11111111 (符号位不参与运算)

第二种不添加符号位: 原码:00000001 反码:11111110 补码:11111111

两种的算数结果都一样,之所以提出这两种方法的时候,是因为我之前在实践负数转化的时候遇到的一个问题. 求反码的时候符号位参与运算吗? 最后实践得出的结论是如果预先对符号位进行了处理,那么就不参与运算,否则就参与。 导致第二种方法也可行的原因是正数的原码不需要进行反码操作,经过反码操作后符位上的数字一定是1, 那就说明所表示的数字一定是负数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值