使用字节数据类型时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
以添加数量。谈到这一点:
当运算符将二进制数字提升应用于一对操作数(每个操作数必须表示可转换为数字类型的值)时,以下规则依次适用:
- 如果其中一个操作数的类型为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
以添加数量。谈到这一点:
当运算符将二进制数字提升应用于一对操作数(每个操作数必须表示可转换为数字类型的值)时,以下规则依次适用:
- 如果其中一个操作数的类型为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
,也会隐式转换回