先列几个概念:
1、原码:
原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用1表示负号,数值一般用二进制形式表示。数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为:(-127~-0 +0~127)共256个
例:
7的原码:0000 0111
-7的原码:1000 0111
7+(-7): 0000 0111 + 1000 0111 = 1000 1000 = 120(显然不对)
所以引入了
2、反码 :
反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。反码的取值空间和原码相同且一一对应。
例:
5的原码:0000 0101
-7的反码:1111 1000(原码:1000 0111 除符号位按位取反)
5+(-7): 0000 0101 + 1111 1000 = 1111 1101(反) = 10000010(原) = -2 (正确)
1+(-1):0000 0001 + 111111110 = 1111 1111 = -0 (错误)
问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).
于是就引入了
3、补码:
负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127)共256个。
注意:
1.(-128)没有相对应的原码和反码, (-128) = (10000000)
2.正数的补码、反码都和原码一样
4、关于右移(>>)和无符号右移(>>>)
byte b = (byte) 0xf1;
byte c = (byte) (b >> 4);// 有符号右移
byte d = (byte) (b >>> 4);// 无符号右移(即高位自动填充0)
byte e = (byte) ((b & 0xff) >> 4);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
结果:
-15
-1
-1
15
为什么c和d的结果是一样的,而e却实现了无符号右移?
首先,在执行b>>4或b>>>4操作时jvm都会先将b转为int型:
1111 1111,1111 1111,1111 1111,1111 0001
>>4 : 1111 1111,1111 1111,1111 1111,1111 1111
>>>4: 0000 1111,1111 1111,1111 1111,1111 1111
转为byte时,截取后8位:1111 1111 其为 -1 的补码。
而先执行了(b & 0xff)操作之后其转为int的二进制:
0000 0000,0000 0000,0000 0000,1111 0001
>>4: 0000 0000,0000 0000,0000 0000,0000 1111
转byte: 0000 1111 故结果为:15
移位操作特别注意:比如int型右移x位, 实际上执行的操作时 x=x%32,所以右移32位实际上是右移了0位!!
分享到:
相关推荐
数制转换软件2进制10进制16进制数制转换软件2进制10进制16进制数制转换软件2进制10进制16进制数制转换软件2进制10进制16进制
二进制数制及其相互转换PPT学习教案.pptx
VC 各种进制 数制相互转换程序,程序支持在二进制、八进制、十六进制、十进制之间转换。源码中ConvertNum目录内的是进制转换控件的源代码,编译后,要将生成的DLL控件拷贝至ConvertDemo目录的Debug目录下运行,也...
教程名称:计算机二进制转换基础知识课程目录:【】0.课程简介【】1....十进制与其它进制的转换【】计算机进制转换二进制、八进制转课程资料 源码 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
计算机数制二进制十进制十六进制总结PPT课件.pptx
用数据结构栈实现的数制转换,将十进制数转换为二进制,八进制,十六进制。
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,
原软件不支持3进制,只能支持32位长度,软件已经修改,请使用2.0版本
数制与编码二进制说课稿配套教案.docx
详细介绍二进制的相关基础知识,同时介绍数制之间的转换和表示方法。是一个很好的基础知识PPT
数制及进制转换PPT学习教案.pptx
可以方便快捷的在二进制、十进制、十六进制之间进行随意转换。好用、方便、原创。谢谢支持!
帮研究生同学写的一个数制转换代码,将二进制数据转换为十进制数,需转换的数据格式为: 1.每行数据的第一个数为任意数制,仅作为标识,可能为正,也可能为负,无需转换,直接去除; 2.每行余下的数据为二进制数据,...
计算机数制二进制十进制十六进制总结PPT学习教案.pptx
实验二 数制转换 将一个十六位二进制数转换为十六进制数并在屏幕输出
第三讲数制数制单片机进制PPT资料.ppt
堆栈实现数字转换(范围:2-16进制)!!!!!!!!!
输出: 10000010 (二进制) 输出: 202 (八进制) 输出: 82 (十六进制) 1、从程序算法的优化程度、程序的通用性、程序的规范性来评判; 2、没有使用已有的函数或软件包来实现,最好是自己根据数制转换...
利用栈实现数制转换 比如二进制,八进制,十六进制之间的转换
计算机数制与进制的精讲二进制与十六进制八进制十进制的转换讲解带例题