摘要:首先,存储的是有符号数,在计算机中,有符号数通常是使用补码存储的,也不例外。先来看看什么叫原码,反码,补码。例如原反补原反补分析所以回到一开始的问题,在计算机中是以补码存储的。
缘起
一次在写测试程序的时候,随手对2取了一个反,当时代码大意如下:
public static void main(String[] args) { int a = 2; System.out.println(~a); }
按照我当时的想法,觉得过程应该是这样的:
a = 2,也就是说a的二进制位10,取反就变成了01,所以结果应该为1。
但是实际的结果值是-3,于是就被打脸了。
知识普及那究竟是为什么结果和我预期的不一致呢?这就要从计算机常用的几个码说起了。首先,java存储的是有符号数,在计算机中,有符号数通常是使用补码存储的,java也不例外。先来看看什么叫原码,反码,补码。
原码原码就是符号位加上真值的绝对值,即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 正数符号位为0,负数为1。
反码正数的反码是其本身
负数的反码是在其原码的基础上,符号位不变,其余各个位取反.
例如:
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
补码正数的补码就是其本身
负数的补码是在反码的基础上+1。
例如:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
分析所以回到一开始的问题,int a = 2 a在计算机中是以补码存储的。
对于2这个正数来说,补码、反码、原码都是相同的,又由于是数值型,在这里我先用八位bit来表示一下:
原码:0000 0010
反码:0000 0010
补码:0000 0010
取反
取反过程是在补码的基础上进行的,由于是按位取反,无论符号位还是数值位都要取反,所以结果如下:
取反后的补码: 1111 1101
换算为值
那么取反后的补码的实际值是多少呢?我们需要先把他转化为原码,过程如下:
反码 = 1111 1101 - 1 = 1111 1100
原码 = 反码符号位不变,其余取反 = 1000 0011
所以,最后的值-3
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65713.html
摘要:在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率。位运算符,这个位代表这什么位二进制位简称位,是二进制记数系统中表示小于的整数的符号,一般用或表示,是具有相等概率的两种状态中的一种。 在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率。 位运算符,这个位代表这什么? 位:二进制位简称位,是二进制记数系统中表示小于2的整数...
摘要:中用补码形式表示第一位正负位,表示负,表示正。原码一个数的二进制表示。的补码是的补码是占个字节,位占个字节,位所以强转时会截断。 showImg(https://segmentfault.com/img/bVbsydY?w=993&h=471); 1、Java中用补码形式表示2、第一位正负位,1表示负,0表示正。3、原码:一个数的二进制表示。 3的原码0000...
摘要:正数用填补,负数用填补。注不同的环境填补方式可能不同低位右移溢出则舍弃该位。感谢您的耐心阅读,如果您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,您的鼓励是作者写作最大的动力。 计算机中有补码表示 0 0 为正数 原码 00000000 00000000 00000000 00000000 反码 00000000 00000000 00000000 00000000 ...
摘要:我们来看一个特殊的运算反码反码反码原码。补码为了解决反码的问题就出现了补码。用原码表示为用反码表示为用补码表示为,表示的补码左移一位后为,该补码对应的反码为该反码对应的原码为符号位不变,其他位取反,为,表示。 在平时看各种框架的源码的过程中,经常会看到一些位移运算,所以作为一个Java开发者是一定掌握位移运算的。 正数位移运算 Java中有三个位移运算: :右移 >>>:无符号右移 ...
阅读 3497·2021-11-18 10:02
阅读 3061·2019-08-29 18:34
阅读 3361·2019-08-29 17:00
阅读 396·2019-08-29 12:35
阅读 699·2019-08-28 18:22
阅读 1854·2019-08-26 13:58
阅读 1636·2019-08-26 10:39
阅读 2654·2019-08-26 10:11