Java错误:可能会丢失精度
我正在制作一个小型Java程序,可以加密任何类型的文件。我这样做的方式如下:打开输入文件,在与该文件大小相同的字节数组中读取它,然后进行编码,然后将整个数组写入名为output.dat的.dat文件。为了索引字节数组,我使用int类型的变量。代码:Java错误:可能会丢失精度,java,byte,bytearray,Java,Byte,Bytearray,我正在制作一个小型Java程序,可以加密任何类型的文件。我这样做的方式如下:打开输入文件,在与该文件大小相同的字节数组中读取它,然后进行编码,然后将整个数组写入名为output.dat的.dat文件。为了索引字节数组,我使用int类型的变量。代码: for(int i : arr) { if(i>0) { arr[i] = arr[i-1]^arr[i]; } } “arr”是
for(int i : arr) {
if(i>0) {
arr[i] = arr[i-1]^arr[i];
}
}
“arr”是与输入文件大小相同的字节数组
我得到的错误是:CodingEvent.java:42:error:可能会丢失精度
arr[i]=arr[i-1]^arr[i]
(一个箭头指向^operator)
必需:字节
找到:int
怎么了?你能帮我个忙吗?字节^字节的结果,与直觉相反,
int
。将表达式赋值回arr[i]
时,对表达式的结果使用强制转换:
arr[i] = (byte)(arr[i-1]^arr[i]);
这是因为运算符被定义为对其操作数执行a操作,因此它真正执行的操作(在本例中)是:
…这自然会导致
int
。这就是我们需要回溯的原因。运算符的操作数是第一位的(称为二进制数字提升)。因此byte
s(arr[i-1]
和arr[i]
)都被转换为int
,操作的结果也是int
您需要将结果转换回
字节
以将其分配给arr[i]如果arr[]是byte[]类型,那么这就是问题所在,当java对整数执行任何二进制操作时,它会根据运算符返回一个int或long。在这种情况下,arr[i-1]^arr[i]的结果是一个int,您试图将其存储在字节中
当运算符&、^或|的两个操作数都是可转换(§5.1.8)为基元整数类型的类型时,首先对操作数(§5.6.2)执行二进制数字提升
及
1.如果任何操作数为引用类型,则应进行解装箱转换(§5.1.8)
2.加宽原语转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:
如果其中一个操作数的类型为double,则另一个操作数将转换为double
否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float
否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long
否则,两个操作数都转换为int类型。
因此,下面的表达式首先转换为int
arr[i-1]^arr[i];
要将其转换回字节
,请使用显式转换:
arr[i] = (byte)(arr[i-1]^arr[i]);
英雄联盟我们都提到二进制数字转换。那太怪了。
arr[i] = (byte)(arr[i-1]^arr[i]);