码迷,mamicode.com
首页 > 编程语言 > 详细

Java之&0xff用法解析以及原码、反码、补码相关知识

时间:2016-08-16 23:54:52      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

char强转至int为什么使用0xff?

备注:在Java中采用补码形式表示二进制
如果不希望进行符号扩展,可以采用与操作。例如char c;int i = c & 0xffff;其中,char有8位,int类型有32位,采用32/8=4个f(即0xffff)做与操作,即可屏蔽符号扩展。
//负整数时,前面输入了多余的 FF ,没有去掉前面多余的 FF,按并双字节形式输出
System.out.println(Integer.toHexString(-2).toUpperCase());//FFFFFFFE
//实质上0xFF会像转换成0x000000FF后再进行位运算
System.out.println(Integer.toHexString(-2 & 0xFF).toUpperCase());//FE
System.out.println(Integer.toHexString(-2 & 0x000000FF).toUpperCase());//FE

//二进制表示形式
System.out.println(Integer.toBinaryString(-2).toUpperCase());//11111111111111111111111111111110,对应-2补码形式经过符号扩展后的表现形式
System.out.println(Integer.toBinaryString(-2 & 0xFF).toUpperCase());//11111110,这是-2的补码形式

符号扩展

用于在数值类型转换时扩展二进制位的长度,以保证转换后的数值和原数值的符号(正或负)和大小相同,一般用于较窄的类型(如byte)向较宽的类型(如int)转换。扩展二进制位长度指的是,在原数值的二进制位左边补齐若干个符号位(0表示正,1表示负)。
 
Java的数值类型转换规则一<Java解惑>总结
1.如果最初的数值类型是有符号的,那么就执行符号扩展;如果是char类型,那么不管它要被转换成什么类型,都执行零扩展。
2.如果目标类型的长度小于源类型的长度,则直接截取目标类型的长度。例如将int型转换成byte型,直接截取int型的右边8位。 
 

解析"多重转型"问题

对于
  1. (int)(char)(byte)-1
Step1:int(32位) -> byte(8位) 
  -1是int型的字面量,其在Java中的补码表现形式为[111...1],即32位全部置1。转换成byte类型时,直接截取最后8位得补码[1111 1111],所以byte对应的十进制数是-1。 
Step2:byte(8位) -> char(16位) 
  由于byte是有符号类型,所以在转换成char型(16位)时需要进行符号扩展,结果为补码[1111 1111 1111 1111]。由于char是无符号类型,所以其对应的十进制数是2^16-1=65535。 
3. char(16位) -> int(32位) 
  由于char是无符号类型,转换成int型时进行零扩展,结果为补码[0000 0000 0000 0000 1111 1111 1111 1111],其对应的十进制数是65535。 

基本概念

正数(定点小数、定点整数): 
    原码,补码,反码相同;
 
负数(定点小数、定点整数): 
     反码:保持原码符号位不变,数值位取反 
     补码:第一种方法给反码的最低位+1就可以啦,若数值最高位有进位则丢弃(不向符号位进位) 
               第二种方法以原码为基础,符号位不变,其他从最低位开始,直到遇到第一个1之前什么都不变,该位之前位依次按位取反,即(推荐 
                    原码: ([符号位][***][1][n*0]),其对应补码仅需对[***]部分依次取反即可。
 
例如,当编码总位数为8时有: 
+127的原码、反码、补码都为:0 1111111 
-127的原码、反码、补码依次为:1 1111111、1 0000000、1 0000001 
 
 
 

扩展学习

已知负数的补码,如何获取其十进制数?

1.先对各位取反,包括符号位
2.转换为十进制数
3.添加负号并减1
例如:对于11111010,取反得00000101,对应十进制数为5,由第三步转换可得到结果:-6
 
 

为何n位二进制数据的表示范围是[-2^(n-1),2^(n-1)-1]?

以8位二进制为例,-128=(-1)+(-127)=([1000 0001]+[1111 1111])原=([1111 1111]+[1000 0001])补=([1000 0000])补,所以在补码运算结果中,([1000 0000])补就表示-128,这就是多出来的一位数据。
 
 
 
 





Java之&0xff用法解析以及原码、反码、补码相关知识

标签:

原文地址:http://www.cnblogs.com/linux007/p/5777967.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!