使用字节数据类型时JAVA中的精度损失

使用字节数据类型时JAVA中的精度损失,java,Java,给出编译错误(可能会丢失精度) 为什么b=9不给出错误,而b=b+9给出精度损失 我被告知9(或任何数字)被视为int,因此精度降低。但是为什么b=9没有给出任何精度误差损失 同样,当写为b+=6时,代码不会给出任何错误。b=b+6和b+=6之间有什么区别 有谁能解释一下这些复杂之处,或者添加一个链接,让我研究一下它们吗?在表达式求值过程中,由于java中的升级规则,有一个隐式类型转换为int 因此: byte b=9 ; b=b+6 ; 写: byte b=1; b=b+1; //will

给出编译错误(可能会丢失精度) 为什么
b=9
不给出错误,而
b=b+9
给出精度损失

我被告知
9
(或任何数字)被视为
int
,因此精度降低。但是为什么
b=9
没有给出任何精度误差损失

同样,当写为
b+=6
时,代码不会给出任何错误。
b=b+6
b+=6
之间有什么区别


有谁能解释一下这些复杂之处,或者添加一个链接,让我研究一下它们吗?

在表达式求值过程中,由于java中的升级规则,有一个隐式类型转换为
int

因此:

byte b=9 ;
b=b+6 ;
写:

byte b=1;
b=b+1;  //will give error
以下是您可以参考的一些链接:


在表达式求值期间,由于java中的升级规则,有一个隐式类型转换为
int

因此:

byte b=9 ;
b=b+6 ;
写:

byte b=1;
b=b+1;  //will give error
以下是您可以参考的一些链接:


添加字节时,结果是一个整数,因此不会出现字节溢出

你应该试着铸造它:

b=(byte)b+1;

当添加字节时,结果是一个整数,这样就不会出现字节溢出

你应该试着铸造它:

b=(byte)b+1;

此代码给出一个错误

b=(byte)(b+9);
。。。因为在
b+6
中出现了二进制数字提升,它将
b
提升到
int
以添加数量。谈到这一点:

当运算符将二进制数字提升应用于一对操作数(每个操作数必须表示可转换为数字类型的值)时,以下规则依次适用:

  • 如果任何操作数是引用类型,则它将进行取消装箱转换(§5.1.8)

  • 加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:

    • 如果其中一个操作数的类型为double,则另一个操作数将转换为double

    • 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float

    • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long

    • 否则,两个操作数都转换为int类型

  • (强调矿山)

    要获得编译的
    b=b+6
    ,可以显式地将结果强制转换回
    byte

    byte b=9;
    b=b+6;
    
    但是
    b=9
    b+=6
    呢?为什么他们编译时没有错误

    9
    是一个常量表达式,Java编译器在缩小赋值方面对其进行了不同的处理

    谈论任务转换

    此外,如果表达式是byte、short、char或int类型的常量表达式(§15.28):

    如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用窄化原语转换

    如果它是一个常量表达式,则可以缩小它的范围,以便编译器知道该值,并且知道不会发生溢出。这就是为什么
    b=9
    不是错误

    讨论复合赋值运算符

    形式为E1 op=E2的复合赋值表达式等价于E1=(T)((E1)op(E2)),其中T是E1的类型,但E1仅计算一次


    也就是说,即使结果提升为
    int
    ,也会隐式转换回
    byte
    。请注意,这可能会溢出而不会出错<代码>字节+=10009将“成功”溢出。

    此代码给出一个错误

    b=(byte)(b+9);
    
    。。。因为在
    b+6
    中出现了二进制数字提升,它将
    b
    提升到
    int
    以添加数量。谈到这一点:

    当运算符将二进制数字提升应用于一对操作数(每个操作数必须表示可转换为数字类型的值)时,以下规则依次适用:

  • 如果任何操作数是引用类型,则它将进行取消装箱转换(§5.1.8)

  • 加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:

    • 如果其中一个操作数的类型为double,则另一个操作数将转换为double

    • 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float

    • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long

    • 否则,两个操作数都转换为int类型

  • (强调矿山)

    要获得编译的
    b=b+6
    ,可以显式地将结果强制转换回
    byte

    byte b=9;
    b=b+6;
    
    但是
    b=9
    b+=6
    呢?为什么他们编译时没有错误

    9
    是一个常量表达式,Java编译器在缩小赋值方面对其进行了不同的处理

    谈论任务转换

    此外,如果表达式是byte、short、char或int类型的常量表达式(§15.28):

    如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用窄化原语转换

    如果它是一个常量表达式,则可以缩小它的范围,以便编译器知道该值,并且知道不会发生溢出。这就是为什么
    b=9
    不是错误

    讨论复合赋值运算符

    形式为E1 op=E2的复合赋值表达式等价于E1=(T)((E1)op(E2)),其中T是E1的类型,但E1仅计算一次

    也就是说,即使结果被提升为
    int
    ,也会隐式转换回