`

byte 新说

    博客分类:
  • Java
阅读更多

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虚拟机会明白你的意思。

 

分享到:
评论

相关推荐

    hex2byte byte2hex

    ### hex2byte与byte2hex知识点详解 在计算机科学领域,数据经常需要在不同的格式之间进行转换,以适应各种应用场景的需求。例如,在网络通信、文件存储等场景中,经常需要将二进制数据(通常表示为`byte`数组)转换...

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

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

    bool2byte_bool2byte_SCL_bit2byte转换_

    本话题关注的是在SCL中进行数据类型转换,特别是“bool2byte”和“bit2byte”的转换,这对于处理PLC内部的布尔值和字节数据至关重要。 首先,我们来看“bool2byte”转换。在SCL中,布尔值(bool)是基本的数据类型...

    byte数组中匹配特定byte数组

    byte数组中匹配特定byte数组,速度比Skip(k).Take(find.Length).SequenceEqual(find)快很多,小于3ms

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

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

    byte-buddy-1.10.11-API文档-中文版.zip

    赠送jar包:byte-buddy-1.10.11.jar; 赠送原API文档:byte-buddy-1.10.11-javadoc.jar; 赠送源代码:byte-buddy-1.10.11-sources.jar; 赠送Maven依赖信息文件:byte-buddy-1.10.11.pom; 包含翻译后的API文档:...

    byte-buddy-1.11.22-API文档-中文版.zip

    赠送jar包:byte-buddy-1.11.22.jar; 赠送原API文档:byte-buddy-1.11.22-javadoc.jar; 赠送源代码:byte-buddy-1.11.22-sources.jar; 赠送Maven依赖信息文件:byte-buddy-1.11.22.pom; 包含翻译后的API文档:...

    C# 图片转成byte存入,数据库读取byte转成图片的类

    在C#编程中,将图片转换为byte数组并存储到数据库,然后从数据库读取byte数组再还原为图片,是一种常见的处理方式。这种方式便于在不直接依赖文件系统的情况下管理和传输图像数据。以下是对这个主题的详细说明: 1....

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

    在Java中,基本数据类型byte与int之间的相互转换涉及到计算机的二进制运算、位移操作以及补码的概念。我们首先了解Java中int和byte的数据结构,然后探讨它们之间的转换方法及其背后的原理。 **基本数据类型结构:**...

    VB 图片转换为Byte()和从Byte()中读取图片的捷径

    VB 图片转换为 Byte() 和从 Byte() 中读取图片的捷径 VB 图片转换为 Byte() 和从 Byte() 中读取图片的捷径是 VB 开发中一个常见的问题。由于 VB 中的图片框支持直接绑定数据库存入图片和读取图片的方法,但是很多...

    c#实现object与byte[]互转

    C#实现object与byte[]互转 在C#中,实现object与byte[]互转是一种常见的需求,特别是在网络通信和数据存储中。这篇文章将详细介绍如何将object转换为byte[],并介绍相关的知识点。 序列化 序列化是将对象转换为二...

    byte-buddy-1.9.16-API文档-中英对照版.zip

    赠送jar包:byte-buddy-1.9.16.jar; 赠送原API文档:byte-buddy-1.9.16-javadoc.jar; 赠送源代码:byte-buddy-1.9.16-sources.jar; 赠送Maven依赖信息文件:byte-buddy-1.9.16.pom; 包含翻译后的API文档:byte-...

    byte-buddy-1.10.20-API文档-中文版.zip

    赠送jar包:byte-buddy-1.10.20.jar; 赠送原API文档:byte-buddy-1.10.20-javadoc.jar; 赠送源代码:byte-buddy-1.10.20-sources.jar; 赠送Maven依赖信息文件:byte-buddy-1.10.20.pom; 包含翻译后的API文档:...

    解决Invalid byte 1 of 1-byte UTF-8 sequence

    标题 "解决Invalid byte 1 of 1-byte UTF-8 sequence" 涉及的问题是关于字符编码不匹配引发的错误,通常在处理包含非ASCII字符的文本文件时出现。UTF-8是一种广泛使用的字符编码标准,能表示世界上大部分语言的字符...

    byte-buddy-1.10.22-API文档-中文版.zip

    赠送jar包:byte-buddy-1.10.22.jar; 赠送原API文档:byte-buddy-1.10.22-javadoc.jar; 赠送源代码:byte-buddy-1.10.22-sources.jar; 赠送Maven依赖信息文件:byte-buddy-1.10.22.pom; 包含翻译后的API文档:...

    byte-buddy-1.6.14-API文档-中文版.zip

    赠送jar包:byte-buddy-1.6.14.jar; 赠送原API文档:byte-buddy-1.6.14-javadoc.jar; 赠送源代码:byte-buddy-1.6.14-sources.jar; 赠送Maven依赖信息文件:byte-buddy-1.6.14.pom; 包含翻译后的API文档:byte-...

    拼接byte数组

    在编程领域,尤其是在处理二进制数据时,我们经常需要操作`byte`数组。`byte`数组是存储和传输原始二进制数据的基本容器。在Java、C#、C++等语言中,`byte`数组扮演着至关重要的角色。本文将深入探讨如何“拼接byte...

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

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

    Base64与byte[]相互转换

    ### Base64与byte[]相互转换 #### 一、Base64编码简介 Base64是一种基于64个可打印字符来表示二进制数据的表示方法。它被广泛应用于电子邮件、网页等需要将二进制数据转换为文本格式进行传输的场景中。Base64编码...

    byte-buddy-agent-1.10.22-API文档-中文版.zip

    赠送jar包:byte-buddy-agent-1.10.22.jar; 赠送原API文档:byte-buddy-agent-1.10.22-javadoc.jar; 赠送源代码:byte-buddy-agent-1.10.22-sources.jar; 赠送Maven依赖信息文件:byte-buddy-agent-1.10.22.pom;...

Global site tag (gtag.js) - Google Analytics