`

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)

分享到:
评论

相关推荐

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

    本文将详细介绍如何在Java中将`byte`数组与其他基本数据类型(如`int`、`long`、`short`、`byte`)之间进行转换。 首先,我们来看`byte`到`int`的转换。Java中的`byte`类型是8位的,取值范围是-128到127。如果要将...

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

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

    java基本类型与byte数组互相转换.pdf

    Java 中的基本类型与 byte 数组之间的转换是非常重要的,以下是关于 Java 基本类型与 byte 数组互相转换的相关知识点: 1. short 类型转换成 byte 数组 在 Java 中,short 类型是 16 位的整数类型,而 byte 数组是...

    Java byte数组与其他类型转换

    本文将深入探讨如何在Java中将byte数组与其他基本类型(如short、int、long)进行转换,这些转换在处理二进制数据、网络通信或序列化等方面至关重要。 首先,我们来看byte数组与short之间的转换。在Java中,byte...

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

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

    int、char、double与byte类型之间相互转换

    Java中的int类型占用4个字节(即32位),因此转换后的byte数组长度为4。 ```java public static byte[] intToByte(int number) { int temp = number; byte[] b = new byte[4]; for (int i = b.length - 1; i &gt;= 0...

    基于java中byte数组与int类型的转换(两种方法)

    在Java编程中,将`int`类型转换为`byte`数组以及从`byte`数组还原回`int`类型是常见的操作,特别是在网络编程中。这是因为网络传输的数据通常以字节流的形式存在,而`int`等基本数据类型需要进行适当的序列化才能...

    常见java中数据类型之间的转换.txt

    ### 常见Java中数据类型之间的转换 在Java编程语言中,数据类型的转换是非常常见的操作之一。通过数据类型转换,可以确保不同数据类型之间的兼容性,并满足特定场景下的需求。本文将详细介绍Java中常见的数据类型...

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

    Java中的数据类型转换是编程过程中不可或缺的部分,它涉及到不同类型之间的值如何在编译和运行时进行转换。在Java中,数据类型主要分为两大类:原始类型(Primitive Types)和引用类型(Reference Types)。原始类型...

    java基本类型与byte数组互相转换

    在Java编程语言中,基本类型的变量(如`short`、`int`、`long`、`char`、`double`和`float`)和`byte`数组之间的相互转换是一项非常实用的技术,尤其是在网络通信、文件读写等场景下。下面将详细介绍如何进行这些...

    java基本类型与byte数组互相转换.doc

    Java基本类型是指Java语言中最基本的数据类型,包括byte、short、int、long、float、double、char、boolean等。这些基本类型在内存中以二进制形式存储,而byte数组是Java中的一种数据结构,用于存储一组byte类型的...

    Java中几种常用数据类型之间转换的方法

    在 Java 中,short 类型的变量可以隐式地转换为 int 类型的变量,这是因为 short 类型的范围是 -32768 到 32767,而 int 类型的范围是 -2147483648 到 2147483647,所以 short 类型的值可以被安全地转换为 int 类型...

    java代码-1·byte short int 在计算是会自动转化为int 2.float double 为近似值,byte short int 转化时可能会精确丢失 3.把大类型转化小的类型时可能会丢失

    首先,我们来探讨“Java中的byte, short, int在计算时会自动转化为int”。在Java中,有五种整数类型:byte、short、int、long和char。当这些类型之间进行算术运算时,较小的类型(byte、short)会被提升到较大的类型...

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

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

    java基本类型与byte数组互相转换文.pdf

    Java 中的基本类型包括 boolean、byte、char、short、int、long、float 和 double 等。这些基本类型可以相互转换,例如将 short 类型转换成 byte 数组、int 类型转换成 byte 数组等。 在 Java 中,基本类型可以...

    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变量类型之间的相互转换

    本文将详细解析JAVA中各种基本数据类型(如`byte`、`short`、`int`、`long`、`float`、`double`)以及它们与字符型、字符串型、日期型等之间的转换机制。 #### 基本数据类型及其取值范围 - **`byte`**:取值范围为...

    java整数与byte数组的转换实现代码

    在Java中,整数可以分为多种类型,如int、long、short等,每种类型都有其对应的byte数组长度。例如,int类型的整数可以转换为4字节的byte数组,而long类型的整数可以转换为8字节的byte数组。 在上面的代码中,我们...

Global site tag (gtag.js) - Google Analytics