zoukankan      html  css  js  c++  java
  • Java之&0xff用法解析以及原码、反码、补码相关知识

    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,这就是多出来的一位数据。
     







  • 相关阅读:
    DEDECMS里面DEDE函数解析
    dede数据库类使用方法 $dsql
    DEDE数据库语句 DEDESQL命令批量替换 SQL执行语句
    织梦DedeCms网站更换域名后文章图片路径批量修改
    DSP using MATLAB 示例 Example3.12
    DSP using MATLAB 示例 Example3.11
    DSP using MATLAB 示例 Example3.10
    DSP using MATLAB 示例Example3.9
    DSP using MATLAB 示例Example3.8
    DSP using MATLAB 示例Example3.7
  • 原文地址:https://www.cnblogs.com/linux007/p/5777967.html
Copyright © 2011-2022 走看看