Java中的字节和短点(我已经阅读了其他问题)

Posted

技术标签:

【中文标题】Java中的字节和短点(我已经阅读了其他问题)【英文标题】:point of Byte and Short in Java (I've read the other questions) 【发布时间】:2011-04-14 11:43:21 【问题描述】:

我的问题是: 如果我从 Java 反汇编中得到它,当我使用时

byte a=3,b=5;
System.out.println(a+b);

实际上会使用 int 而不是 byte。此外,所有本地内存插槽都是 4B,就像堆栈插槽一样。我意识到分配一个字节数组可能会更有效,但是使用单个字节值最终是低效的吗? (简称同点)

【问题讨论】:

我的建议:当你需要处理 bytes 时使用 byte。当您需要处理 数字 时使用 int。它们并不完全相同。 【参考方案1】:

+ 是整数运算。这就是为什么

byte c = a+b; // compile error

你应该使用

int c = a + b 

byte c = (byte)(a+b);

我的建议是使用int,以免每次都投射。如果你总是处理byte,使用字节,否则使用int

【讨论】:

点了,我的意思是 System.out.println(a+b);【参考方案2】:

重要的是要认识到,在 Java 中,byteshort 的存在主要不是为了具有较小范围的整数数据类型。在几乎所有存储(足够小的)数值的情况下,将使用int,即使有效范围仅为 0-100。

byteshort某些外部因素 将要处理的数据限制在这些范围内时使用。它们的存在只是为了简化与此类系统的交互。

例如,如今的文件系统存储字节流。您可以int 用于所有这些读/写操作,但使用byte 数据类型可以简化操作并明确区分。

【讨论】:

【参考方案3】:

性能调优的第一条规则应该是编写简单、清晰的代码。

在此示例中,没有性能差异,即使 println() 需要 10,000 倍的时间,也不会产生任何差异。


程序在字节码中的显示方式与在本机代码中的显示方式不同。

在 JVM 中,并非所有插槽都是 4 字节。例如64 位机器上的引用可以是 8 字节,但它仍然使用一个“插槽”

您的机器没有插槽。它确实具有通常为 32 位或 64 位的寄存器。

在您的示例中,使用了字节操作,它与 int 操作一样有效,并且可以产生不同的结果,因此仍然需要它们。

注意:带有byteshort 字段的对象可以小于带有int 字段的对象。

在这个例子中,JVM 可以计算一次c,所以它不需要ab

【讨论】:

所以基本上尽管在 64 位机器上 int(作为 Java 变量)将是 4B 并且指针/引用将是 8B,但 VM 会将它们都视为原子局部变量。这是正确的吗? @George Penn,正确。但是,如果您在 64 位 JVM 上使用 -XX:+UseCompressedOops,则引用将是 4 字节而不是 8 字节。 ;)【参考方案4】:

byte a=3,b=5; 声明为final byte a=3,b=5;,这样当该语句byte c = a+b; 将被执行时,它将采用byte 而不是int

【讨论】:

【参考方案5】:

定义低效。

是的,内存占用似乎效率低下,但请记住,当今的大多数处理器都是 32 位(甚至是 64 位)。仅以 8 位存储一个字节需要处理器获取 32 位地址空间并对其进行移位和清理,以便将必要的 8 位放在正确的位置。

【讨论】:

从某种意义上说 int 效率低下:a) 更快 b) 更多用途 c) 相同的内存占用 谢谢

以上是关于Java中的字节和短点(我已经阅读了其他问题)的主要内容,如果未能解决你的问题,请参考以下文章

Java中负字节和短数据类型中的位操作

在 JavaCard 中将字节转换为短字节

Java - 为啥 char 不应该被隐式转换为字节(和短)原语?

为啥字节和短除法会在 Java 中产生 int?

为啥jvm在推入堆栈之前将字节和短扩展为int?

混乱的jvm