`

Java中byte、short、int之间的转换

阅读更多

先温习下计算机基础理论

byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,
也就是说0000 0001代表的是数字1
1000 0000代表的就是-1
所以正数最大位0111 1111,也就是数字127
负数最大为1111 1111,也就是数字-128

上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码

1、反码:
        一个数如果是正,则它的反码与原码相同;
        一个数如果是负,则符号位为1,其余各位是对原码取反;

2、补码:利用溢出,我们可以将减法变成加法
    在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。

    ⑴一个数为正,则它的原码、反码、补码相同
    ⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1就得到补码了
    
 - 1的原码为                10000001
 - 1的反码为                11111110
                                            + 1
 - 1的补码为                11111111
 
 0的原码为                 00000000
 0的反码为                 11111111(正零和负零的反码相同)
                                          +1
 0的补码为               100000000(舍掉打头的1,正零和负零的补码相同)

 

下面来看看java中DataInputStream源码中的readShort()与readUnsignedShort()的区别

 

    public final short readShort() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        if ((ch1 | ch2) < 0)
            throw new EOFException();
        return (short)((ch1 << 8) + (ch2 << 0));
    }

 

    public final int readUnsignedShort() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        if ((ch1 | ch2) < 0)
            throw new EOFException();
        return (ch1 << 8) + (ch2 << 0);
    }

首先说明short的大小为16bits而int的大小为32bits,java的二进制采用的是补码形式

为什么readUnsignedShort() 中的(ch1 << 8) + (ch2 << 0)可以直接返回int,Unsigned就是无符号的意思,那读写的就是正数了,由于正数的原码和补码相同,所以short的前16位就自动补0了,但是如果是负数的话前16位补的就是1了,这是不正确的,比如说要读short a=-20 ,a的原码是:00000000 10010100,补码是:11111111 01101100 ,那ch1=255,ch2=236,(ch1 << 8) + (ch2 << 0)就是11111111 11111111 11111111 01101100 结果就是65536而不是-20了,必须与0xffff做&运算让高16位补0,既 ((ch1 << 8) + (ch2 << 0))&0xfffff(ffff的二进制为16个1)

分享到:
评论

相关推荐

    byte数组转换工具类 byte数组转int,byte数组转short,short转byte数组

    byte数组操作的工具类,支持byte数组转int,int转byte数组,byte数组转short,short转byte数组。。。 下载的人多了,csdn会自动涨分,现在可以手动调了,我给降到最低了

    java byte数组与int,long,short,byte的转换实现方法

    下面小编就为大家带来一篇java byte数组与int,long,short,byte的转换实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    int类型和byte数组之间的转换

    写一个方法,将int类型转换为字节数组,输入任意int类型整型,输出字节数组;写第二个方法,输入字节数组,输出对应int类型数据。

    Java中各个数据类型之间的转换

    由于实际开发中这样的类型转换很多,所以Java语言在设计时,没有为该操作设计语法,而是由JVM自动完成。 转换规则 从存储范围小的类型到存储范围大的类型。 具体规则为: byte→short(char)→int→long→float→...

    java实现的字节数组转换成基本类型,基本类型转换成byte[]

    char short int long float double 转换成byte数组

    java数据类型转byte数组

    ip地址转4字节byte,char转2字节byte,byte数组转char,int整数转换为4字节的byte数组,byte数组转换为int整数,double类型转8字节数组,8位数组转double,long整数转换为8字节的byte数组,short整数转换为2字节的...

    java数据类型的转换简单数据类型之间的转换 (2). 字符串与其它数据类型的转换 (3). 其它实用数据类型转换

    一些初学JAVA的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,double型之间的转换,整数和String类型之间的转换,以及处理、显示时间方面的问下面笔者就开发中的一些体会介绍给大家。 我们知道,...

    Java 基础 byte[]与各种数据类型互相转换的简单示例

    主要介绍了Java 基础 byte[]与各种数据类型互相转换的简单示例的相关资料,这里对byte[]类型对long,int,double,float,short,cahr,object,string类型相互转换的实例,需要的朋友可以参考下

    类型转换java

    键盘输入1个字符串,如果是整数数字串,如”4353”, 分别按八进制和十六进制输出,以及按byte,short,int,long,char输出;每个数占10位长.每行输出3个数; 如果是带小数数字串,如”243.58”,分别按short,int,long,float...

    Java Number & Math 类.pdf

    Java Number类是Java中的一个抽象类,它是所有数值类型的超类,包括整数、浮点数和大数。它提供了一组用于操作数值类型的方法,如转换、比较、算术运算等。 二、Java Number类提供了哪些基本的数字操作? Java ...

    02.Java基础语法

    注意: byte short char 在表达式中,是直接提升成int运算的 面试笔试题: byte b1 = 21; byte b2 = 22; byte b3 = b1 + b2 ; // 错误形式 int b3 = b1 + b2 ; byte b3 = (byte) (b1 + b2);

    java_android_类型转换工具类的标准代码

    int转换为byte数组 byte数组转换为int 保留几位小数 null转String String转Byte String转Boolean String转Int String转Short String转Double Int转String Double转Long Double转Int Long转Double Long转Int String转...

    阿里2017年Java学科面试测试题

    但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-068-Java基本语法-数据类型转换-int向byte、short、char型变量赋值.avi 北京动力节点-Java编程零基础教程-069-Java基本语法-数据类型转换-byte、short、char型数据间的运算.avi ...

    JAVA8大数据类型.pdf

    不同类型数据间的优先关系如下: 低---------------------------------------------&gt;⾼ byte,short,char-&gt; int -&gt; long -&gt; float -&gt; double 运算中,不同类型的数据先转化为同⼀类型,然后进⾏运算,转换规则如下: ...

    java 学习笔记 JAVA入门 整理

    //swtich 中可用的数据类型主要是 byte short int char enum //swtich 中的控制表达式的返回值应与 case 后的变量类型相一致 //关于数据类型 : 低精度与高精度运算会转换为高精度 // 整理的不多 只是为了加点分

    Java基础面试题.doc

    Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。 2、float f=3.4;...

    Java企业面试问题2.txt

    2.1java中的8种基本数据类型:boolean byte char short int float double long 2.2:基本数据类型和它对应的封装类型之间可以相互转换,从基本数据类型到封装类 型叫做装箱,从封装类型到基本数据类型叫拆箱,...

    php字符串与byte字节数组转化类.zip

    介绍php字符串与byte字节数组转化类,转换一个String字符串为byte数组,将字节数组转化为String类型的数据,转换一个int为byte数组,从字节数组中指定的位置读取一个Integer类型的数据,转换一个shor字符串为byte...

    Java面试宝典(传说中的葵花宝典).doc

    在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是...

Global site tag (gtag.js) - Google Analytics