资讯专栏INFORMATION COLUMN

【深入浅出-JVM】(2):原码、反码、补码

qpwoeiru96 / 2370人阅读

摘要:正数用填补,负数用填补。注不同的环境填补方式可能不同低位右移溢出则舍弃该位。感谢您的耐心阅读,如果您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,您的鼓励是作者写作最大的动力。

计算机中有补码表示 0

0 为正数

原码 00000000 00000000 00000000 00000000
反码 00000000 00000000 00000000 00000000    正数反码等于原码
补码 00000000 00000000 00000000 00000000    正数补码等于原码

0 为负数
原码 10000000 00000000 00000000 00000000
反码 11111111 11111111 11111111 11111111 负数反码等于原码符号位不变,其余取反
补码 00000000 00000000 00000000 00000000 负数补码等于反码+1

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

数值 原码 反码 补码
+0 0000 0000 0000 0000 0000 0000
-0 1000 0000 1111 1111 0000 0000
补码、原码、反码转换

负数原码转补码,最高位不变,其余取反,然后 +1
10000001
11111110
11111111
负数补码转原码,最高位不变,其余取反,然后+1 补码->反码->原码->反码->补码 ,(二进制数,先-1再取反和先取反后+1,结果一样)
11111111
10000000
10000001

负数反码转原码
符号位不变,其余取反
11111111
10000000

区别:

8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].

补码可以多表示一个范围,其实是利用补码 10000000 的原码是 = -128

原码最大的问题就是 一个数加上他的相反数不等于 0

已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1

补码

常用概念

左移

左移的规则只记住一点:丢弃最高位(符号位),0补最低位

右移

左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;
低位右移溢出则舍弃该位。

无符号右移

左边空出的位用0填补,低位右移溢出则舍弃该位。

感谢您的耐心阅读,如果您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,您的鼓励是作者写作最大的动力。

作 者 : @mousycoder

原文出处 : http://mousycoder.com/thinkin...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75358.html

相关文章

  • 一文搞明白位运算、补码反码原码

    摘要:我们来看一个特殊的运算反码反码反码原码。补码为了解决反码的问题就出现了补码。用原码表示为用反码表示为用补码表示为,表示的补码左移一位后为,该补码对应的反码为该反码对应的原码为符号位不变,其他位取反,为,表示。 在平时看各种框架的源码的过程中,经常会看到一些位移运算,所以作为一个Java开发者是一定掌握位移运算的。 正数位移运算 Java中有三个位移运算: :右移 >>>:无符号右移 ...

    tunny 评论0 收藏0
  • C语言中数据的存储

    摘要:这里强调一下,之前讲过一个操作符按位取反操作符,区别一下他俩,按位取反操作符是针对二进制数每一位全部都取反,包括符号位。 目录 传统艺能?过渡区?正片开始?数据类...

    LeanCloud 评论0 收藏0
  • 从Java中的取反号‘~’看原码反码补码

    摘要:首先,存储的是有符号数,在计算机中,有符号数通常是使用补码存储的,也不例外。先来看看什么叫原码,反码,补码。例如原反补原反补分析所以回到一开始的问题,在计算机中是以补码存储的。 缘起 一次在写测试程序的时候,随手对2取了一个反,当时代码大意如下: public static void main(String[] args) { int a = 2; Sy...

    Rainie 评论0 收藏0
  • Java位运算符浅析

    摘要:在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率。位运算符,这个位代表这什么位二进制位简称位,是二进制记数系统中表示小于的整数的符号,一般用或表示,是具有相等概率的两种状态中的一种。 在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率。 位运算符,这个位代表这什么? 位:二进制位简称位,是二进制记数系统中表示小于2的整数...

    zhaofeihao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<