`
liushilang
  • 浏览: 88842 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中的byte

 
阅读更多
Java虚拟机中没有byte类型
恩。。。怎么说呢,个人感觉这个说法有点儿唬人的意思。的确,当这个想法刚刚出现在我的脑海中的时候我觉得也有些胡扯,毕竟byte类型就在那里,怎么能说Java虚拟机中没有byte类型呢?

好吧,我来稍稍的解释一下。Java虚拟机对基本类型的操作基本都是在栈上完成的(这个是可信的,因为不是我说的)。我们知道,Java在处理一个语句的时候,首先它会先把用到的操作数压到栈中,然后再从栈中弹出进行计算,最后将结果再压回到栈中。任何对byte的操作也会如此。因此,Java对byte类型操作之前会将其压入到栈中。实际上,Java压入栈的不是byte类型,而是一个标准的int类型(32位,byte是8位),也就是说,Java虚拟机将我们短小可爱的byte类型压入栈之前,会先把它拉长成int类型再压栈。(不过事实上在压栈之前也是int类型)这样一来,我们不管是在栈里还是从栈里弹出的byte类型实际上都是用int的长度存储的。这也就是我为什么说,Java虚拟机中没有byte类型。因为它们都被变成了int。

int?还是byte?
这么说来在Java虚拟机中处理来处理去的都是32位长的int,那么byte怎么办?换句话说,如果我们看到一个32位的int,那我们应该管它叫int呢还是叫byte呢?(这句话有些拗口,我会在下次换一种描述的)

对于这个问题,我个人的答案是你叫丫虾米丫就是虾米。举个例子来说吧:现在栈顶端有两只。。。恩。。。32位长的。。。恩。。。你明白我的意思。你想对它们进行相加运算。在这个时候你的作用就很明显了,当你对虚拟机说把它们俩给我相加成一个整数(int),那么Java虚拟机会弹出这两个东西,然后相加,将结果以int类型压回到栈中。但是如果你对虚拟机说:把这两个byte相加成一个byte或者把它们俩相加成一个byte,那么Java虚拟机还是会弹出这两个东西相加,只不过前面那句会先将它们俩转换成byte再变成int,然后相加;而后面那句会直接相加。两句的最后结果都是将相加的和先转换成byte然后在变成int压入栈中。

类型转换
那么,类型转换呢?这个总该是一个byte了吧!

可惜,我只能说类型转换的过程中会出现真正的byte,但是它活不到最后就被拉长了。举个例子吧,看看下面我从有意义的程序中找出的两句毫无意义的代码吧:

int a = 1;
byte b = (byte)a;
好吧,我承认会这么写的代码,程序也不会有意义到哪儿去。但是我们就事论事。当我刚开始看到这个的时候,我非常兴奋的认为上面的那个变量b总应该是byte了吧。如果你和我一样,那么恭喜你离天才又进了一步。

我只能说答案是否定的。不是为了打击你,而确确实实是否定的。是的,第二句在执行的时候确实产生了一个byte,但是很不幸,它没能活到最后。最终它被拉长成了int压入了栈中,用来做为byte变量b的值。虽然它被拉长成了32位的int,但是毕竟它是byte来的,所以身上还是有byte的血统的。怎么说呢,那就是它是被虚拟机带着符号扩展出来的。这个很好理解,byte本身就是8位0或者1的组合,你就是把8位上每一位0或者1拉的再长,充其量也就是长的长一些的0或者1的byte。所以要想变成32位,你得给byte填补24位进去。那么这24位从哪里来呢?Java虚拟机的做法就是从byte的符号位(也就是最高位)来。这就是所谓的带符号扩展。就拿上面的程序举例子吧,将1压缩成byte用二进制来看是00000001,这个我想大家都不陌生。接下来就是扩展,我们byte的符号位是正,也就是0,那么Java虚拟机就会用0来填充剩下的24位,结果就是00000000000000000000000000000001。自己数一下看我是不是漏掉了。

大家可能觉得我举的例子有些太简单了,好吧,我来说一个难的。让byte变量b等于-1。当然,不是简简单单的从-1的int类型变成-1的byte类型,而是找一个正整数的int类型,让Java虚拟机截短成-1的byte类型。那么这个正整数是几呢?说实话,我拿高级计算器试了一天,最后从google上找到了它:2147483647。只要把上面语句中a的值改成这个,byte变量b的值就会是-1。非常简单,我觉得不需要解释。
。。。
。。。
对不起,我有点儿得瑟和臭屁了。我还是解释一下吧:那个2147483647整数的二进制是这样的:01111111111111111111111111111111,仔细数,是32位。现在我们要把它强制转换成byte,只有8位,所以Java虚拟机不假思索的给咱们砍掉24位,剩下8位都是1:11111111,这个当然就是那个-1了。什么?你说不是?是-127?不不不不,不要忘了,Java虚拟机中使用补码来表示的,你看到的是补码。这次再算算,-1了吧。好了,接下来就是扩充回int类型了。简单的把符号位复制24个出来就好了,结果就是11111111111111111111111111111111。这个是几?自己算吧。

总结
好了,说了这么多,我们也看到了,虽然Java虚拟机中的操作数可以是一个byte,但是不管是运算也好还是类型转换也好,最终的结果都是int。至于在执行过程中如何区别,那就全靠写程序的人自己了。如果你自己都模棱两可的话,不要指望Java虚拟机会明白你的意思。
分享到:
评论

相关推荐

    Java中byte[]、String、Hex字符串等转换的方法

    Java中byte[]、String、Hex字符串等转换的方法 Java中byte[]、String、Hex字符串等转换的方法是非常重要的知识点,这些转换方法在实际开发中经常被使用。下面将详细介绍这些转换方法。 byte[]和byte的合并 在Java...

    Java byte数组与其他类型转换

    在Java中,byte数组可以被用来存储short类型的值,因为一个short占用两个字节。`putShort`和`getShort`方法用于在字节数组中写入和读取short值。这两个方法内部都采用了位移操作来完成转换。例如,`putShort`方法...

    Java中byte转int的方法

    byte转化为int有两种情况: ...  2)保持低字节中各个位不变,3个高字节所实用0填充  应用场景:编解码操作,  方法:?用位操作:int i = aByte & 0xff。  比如:若aByte=0xff,转化为int后。i为0x000000ff。

    Java中byte、byte数组与int、long的转换详解

    1. **Java中byte和int之间的转换** `byte`和`int`之间的转换相对简单。Java中的`byte`是8位(1字节)的有符号整数,范围为-128到127,而`int`是32位(4字节)的有符号整数,范围更广泛。转换方法如下: - **int...

    Java中byte输出write到文件的实现方法讲解

    Java中byte输出write到文件的实现方法讲解 Java中byte输出write到文件的实现方法是一种常见的操作,今天我们将详细讲解这种方法的实现过程。首先,我们需要了解Java中byte输出的基本概念。在Java中,byte是基本数据...

    JAVA转byte[]为int,long,double

    在Java编程语言中,将`byte[]`数组转换为`int`, `long`, 和 `double`类型的数据是一项常见的任务,特别是在处理二进制数据或网络通信时。以下将详细讲解如何进行这些转换,并提供相关代码示例。 1. **转换byte[]到...

    java byte相互转换详解左右位移

    2. **int转byte**:将int转换为byte数组时,我们需要将int的每个字节分离到byte中。这可以通过右移并用0xFF进行AND操作来实现。例如,`int a = 1246; byte[] b = new byte[4]; b[0] = (byte) (a >> 24 & 0xFF);` ...

    java中字节数组拼接

    使用链式编程写法实现Java中byte数组的拼接。例如byte[] bytes = ByteUtils.get().add(0x41).add(07).add(11).add("15288930000").add(0x45).toArray();更灵活用法请参考Mybytes

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

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

    java byte转换工具类

    用于java,byte与各种对象的转换,Integer、short、hex、string

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

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

    java中两个byte数组实现合并的示例

    在Java编程语言中,有时我们需要将两个或多个字节数组(`byte`数组)合并成一个新的单一数组。这种情况在处理二进制数据、文件读写或者与硬件交互时尤其常见。本文将深入探讨如何在Java中实现两个`byte`数组的合并,...

    Java将图片转换为byte数组例子总结

    在Java编程中,经常需要处理图像数据,特别是在网络传输或存储时,将图像转换为`byte`数组是一种常见的做法。这不仅可以提高传输效率,还可以方便地进行存储。本文将详细介绍如何使用Java将图片转换为`byte`数组以及...

    字节流生成word文档

    标题“字节流生成word文档”涉及到的是在Java编程中如何使用字节流技术来创建Microsoft Word(.doc或.docx)文件。字节流是Java IO中的一个重要概念,它用于处理二进制数据,如图像、音频、视频或者如Word文档这样的...

    java中把对象转化为byte数组的方法.doc

    java中把对象转化为byte数组的方法 Java 中将对象转化为 byte 数组的方法是指将 Java 对象序列化为二进制数据流,以便在网络上传输或存储。这种方法可以应用于各种领域,如分布式计算、网络通信、数据存储等。 在 ...

    Java String与Byte类型转换

    在Java编程中,String对象和Byte类型的转换是常见的操作,特别是在网络编程中,因为网络通信通常涉及字节流的处理。下面将详细讲解Java中如何进行这两种类型之间的转换,并探讨其在网络编程中的应用。 首先,让我们...

    Java数值类型与byte数组相互转换

    Java bytes数组与基本类型的相互转换 Int -> Bytes int64ToByte8 int48ToByte6 int40ToByte5 int32ToByte4 int24ToByte3 int16ToByte2 int8ToByte Bytes -> Int bytesToInt64 bytesToInt48 bytesToInt40 bytesTo...

    ByteBuddy在运行期生成Java代码的库

    ByteBuddy是Java平台上的一款强大的代码生成库,它允许开发者在程序运行期间动态地创建新的Java类或修改已有类的字节码。这个库的独特之处在于它无需借助于外部编译器,可以在运行时直接对字节码进行操作,极大地...

    浅谈java的byte数组的不同写法

    Java中的字节(byte)类型是基本数据类型之一,它占据8位,即1个字节的存储空间。由于一个字节由8位组成,因此它可以表示2^8(即256)个不同的值。在Java中,byte类型的取值范围是从-128到127,包括两端的负数和正数...

Global site tag (gtag.js) - Google Analytics