首页 > 其他分享 >byte加byte居然是int了?

byte加byte居然是int了?

时间:2024-12-25 20:43:22浏览次数:2  
标签:Java 运算 int 类型 byte 居然 写法

问题现象

最近在看 Java 的基础知识时看到一个有意思的现象,在 Java 中两个 byte 相加之后的结果的类型变成 int 类型了:

byte a = 1;
byte b = 2;
b = a + b;

image

从Idea给的提示可以看到,两个 byte 类型相加的结果变成了 int 类型,不能赋值给一个 byte 类型变量。其实不只是 byte,包括:short、char 等类型执行运算之后的结果也变成 int 类型了,不再是参与运算之前的类型。

如果想要上述代码能够正常编译和运行,可以修改为如下的写法:

// 写法一
byte a = 1;
byte b = 2;
b = (byte) (a + b);

// 写法二(这种写法是上面写法的一种简化写法,具体可以见:https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.26.2
byte a = 1;
byte b = 2;
b += a;

问题原理

首先根据 Java 语言规范的描述,在执行加法或者减法运算时,会对操作数进行类型提升

image (2)

在进行类型提升的时候,byte、short、char 类型都会提升为int类型,由于两个数都提升为了 int 类型,它们执行的运算结果自然而然也就是 int 类型的了。

image (3)

在 JVM 的操作数栈的一个单位长度是 32 位,因此为了把参与运算的数放到操作数栈中就必须对其进行扩展,同时我理解这里也是为了和局部变量表的单位相匹配,局部变量表的基本单位是槽位,一个槽位的宽度也是 32 位。

image (4)

image (5)

从字节码指令也可以说明这点,JVM 中基本上没有关于 byte 类型运算的字节码指令:
image (6)

test

标签:Java,运算,int,类型,byte,居然,写法
From: https://www.cnblogs.com/javadaydayup/p/18631370

相关文章

  • 一个 Bug JDK 居然改了十年?
    问题现象今天偶然看到了一个JDK的Bug,给大家分享一下。假设现在有如下的代码:List<String>list=newArrayList<>();list.add("1");Object[]array=list.toArray();array[0]=1;System.out.println(Arrays.toString(array));上面的代码是可以正常支执行的,如下图所......
  • java8--程序--输入与格式化输出--Saner&printf
    packageInputTest;importjava.util.Scanner;publicclassInputTest02{publicstaticvoidmain(String[]args){//English();Chiness();}publicstaticvoidEnglish(){Scannerin=newScanner(System.in);......
  • VScode中配置ESlint+Prettier详细步骤(图文详情)
    VScode中配置ESlint+Prettier详细步骤(图文详情)前置环境:node18.19.0vite3.2.11vue3.2.47本文将不在演示vue3基础工程创建,如果还没有vue3项目工程请参考文章:Vite创建Vue3工程并引入ElementPlus(图文详细)本文的ESlint+Prettier版本:ESlint8.57.1Prettier3.2.51ed......
  • 【异常】428 - {“error“:{“message“:“Insufficient points, please recharge 积
    一、报错内容Causedby:org.springframework.ai.retry.NonTransientAiException:428-{"error":{"message":"Insufficientpoints,pleaserecharge积分不足,请充值","type":"openai_hk_error"}} atorg.springframework.ai.retry......
  • npm ERR! code EINTEGRITY 解决方案
    npmERR!codeEINTEGRITY解决方案|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|-----......
  • intN_t, uintN_t
    g++(Ubuntu9.3.0-17ubuntu1~20.04)9.3.0usingint128_t=__int128_t;usinguint128_t=__uint128_t;#include<bits/stdc++.h>usingnamespacestd;int8_ti8=0;int16_ti16=0;int32_ti32=0;int64_ti64=0;uint8_tu8=0;uint16_tu16=0;ui......
  • Chapter 6 Optimize decision making with AI - Simple versus Intelligent Data Anal
    decisionmaking≈datadrivendecisionmakingData-drivendecision-makingreferstoleveragingaggregatedandsummarizeddatatodrivecriticaldecisions.Thedataservesasacompass,allowingyoutorefineyour“gutfeeling”andminimizebiasinyourde......
  • intellij idea使用:激活码与插件问题
    下载官网下载,不需要下载最新版的,我下载的是2024.2.3,能正常使用激活码安装教程去网上搜,有一大把激活码这里整合了两个靠谱的激活码更新网站,里面会更新免费的激活码,拿来用即可,比在网上搜省很多时间,网上很多都是打广告的,没有有效信息。https://www.yuque.com/hudies/coding/dm2......
  • 【C语言】[waring]comparison between pointer and integer报错
     原因:在C语言中,指针和整型是不同的数据类型,它们之间不能直接进行比较。 改正:在arr[i]前加&取地址  [waring]comparisonbetweenpointerandinteger改正方法:1.显式类型转换(不推荐)intvalue=10;int*ptr=NULL;if((int)ptr==value){}这里if((int)ptr......
  • IntraWeb的HelloWorld
    添加一个TIWButton到Unit1界面上 双击这个IWButton1procedureTIWForm1.IWButton1Click(Sender:TObject);beginWebApplication.ShowMessage('IntraWebhelloworld');end; 退出,在托盘右击图标点,shutdown关闭退出 ......