开发者社区> 问答> 正文

java中byte和short的赋值和占位问题?报错

java中byte是8为,short是16位,为什么我在给他们赋值的时候IDE会报错,int和long却没有问题?

展开
收起
爱吃鱼的程序员 2020-06-07 18:16:44 903 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <pre><code>A.java:7: 错误: 不兼容的类型: 从int转换到byte可能会有损失
    

    byte b1 = 0xAA; ^ A.java:9: 错误: 不兼容的类型: 从int转换到short可能会有损失 short s1 = 0xAAAA; ^ 2 个错误

    编译时候,进行检查,看赋值大小是否超过变量的类型所容纳的范围。

    如果超过,报错:从int转换到byte可能会有损失,

    如果没超过,编译通过

    变量的类型

    该变量类型所容纳的范围

    ( MAX_VALUE 十进制)
    初始值( 10 进制)初始值( 16进制)
    byte1271700xAA
    short32767436900xAAAA
    int214748364728633158990xAAAABBBB
    long9223372036854775807122978481477578173090xAAAABBBBCCCCDDDDL
    1. 从表中看出,两处(byte b1 = 0xAA; 和 short s1=0xAAAA;) 没有通过编译的原因,都是因为初始赋的值超过变量的类型所容纳的范围。
    2. 长型 变量 l 的初始化值 0xAAAABBBBCCCCDDDD 同样也超过了长型变量的最大值。只是因为数值的尾部加了一个L,避免了上述的检查。但后来调用方法 System.out.println(l);, 就会看到一个“垃圾”输出: -6148895925951734307。
    3. 整型变量 i  的初始化,编译时也没有检查(可能是用了16进制形式的缘故?)。从表中看出,0xAAAABBBB 已经超出了int型变量的最大正整数值:2147483647。所以“初始化”之后,若调用方法 System.out.println(i);, 就会看到一个“垃圾”输出: -1431651397。如果用10进制形式初始化: int i = 2863315899; 同样逃不掉编译器的眼睛:
      A.java:6: 错误: 过大的整数: 2863315899
      int i= 2863315899;
             ^
      1 个错误
      

       

                                回复 <a class="referer" target="_blank">@pinitianjie</a>  : 值得深思/详谈。
                        
    
                            编译器不对超限的int和long进行检查,这个是为什么
                        
    
                        <p>Java 中都是有符号数。最高位表示正/符,其余位是有效位。最高位是1时,要以补码进行计算</p>
    

    贴一个JLS 中的英文:

    An integer literal is of type long if it is suffixed with an ASCII letter L or l (ell);
    otherwise it is of type int.

    int i = 0XAAAABBBB;

    byte b = 0XA;

    short s = 0XAAA; 正常

    0XAA 十进制为170,大于byte的最大值127
    0XAAAA 被认为是int值,且大于了short的最大值32767,不能赋值为short。

    long 是64位且声明了该16进制数为long型,且最高位为1进行逆补码运算后结果为-6148895925951734307

                        这错误鼠标悬浮应该会告诉你吧 
                    
    
                        <p>你连基本类型的最大值和最小值都不知道,建议</p>
    
                    
    
                            大佬请讲解一下。定义一个short类型字段,怎么set值给他
    
    2020-06-08 11:16:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载