Fro*_*koy 1 java int byte bit-shift
考虑以下代码(其中byteIndex是一个int):
int bitNumber = b-(8*byteIndex);
bitMask = 0x8>>(byte)bitNumber;
Run Code Online (Sandbox Code Playgroud)
这会产生错误
error: possible loss of precision
Run Code Online (Sandbox Code Playgroud)
编译时(必需字节,找到int).
代码
int bitNumber = b-(8*byteIndex);
bitMask = 0x8>>2;
Run Code Online (Sandbox Code Playgroud)
编译好.
这里有什么问题,如何修复第一个允许按int值移位的例子?
编辑:在评论之后,这是一个更完整的例子:
48) int byteIndex;
49) byte bitMask;
50) int bitNumber;
// assign value to byteIndex
67) bitNumber = b-(8*byteIndex);
68) bitMask = 0x8>>bitNumber;
Run Code Online (Sandbox Code Playgroud)
并且给出的错误是:
...MyClass.java:68: error: possible loss of precision
bitMask = 0x8>>bitNumber;
^
required: byte
found: int
1 error
Run Code Online (Sandbox Code Playgroud)
将您的shifting行转换为: -
byte bitMask = (byte)(0x8>>(byte)bitNumber);
Run Code Online (Sandbox Code Playgroud)
您的RHS是一个int,您需要将其类型化为字节.
上面的代码将正常工作..不管有没有casting的bitNumber到byte
所以,你也可以: -
byte bitMask = (byte)(0x8>>bitNumber);
Run Code Online (Sandbox Code Playgroud)
但是,这是一个问题 - byte bitMask = 0x8>>3;工作得很好..为什么会这样?
这里有一些例子来解释其工作原因以及行为final: -
byte bitMask;
int varInt1 = 3;
final int finalVarInt2 = 3;
final int finalVarInt3 = 4;
bitMask = 0x8>>varInt1; // 1. Will not work.
bitMask = 0x8<<3; // 2. Will work
bitMask = 0x8<<4; // 3. Will not work
bitMask = 0x8<<finalVarInt2; // 1. Will work
bitMask = 0x8<<finalVarInt3; // 2. Will not work
Run Code Online (Sandbox Code Playgroud)
以下是解释上述行为的一些推理: -
typecasted只有当编译器确定它能够byte在LHS 的变量中容纳该值时,RHS上的值才会隐含.否则,我们必须Explicit type casting告诉编译器,我们知道我们在做什么,只为我们做..现在让我们逐一考虑所有情况(从上面的代码(1-3,1-2): -
varInt1最初包含3.因此RHS的价值评估为64.虽然这个值可能适用byte于LHS中的变量,但编译器也知道,可以更改...的值varInt1.那么如果值在某个阶段varInt1更改为4,那么它将无法工作...那就是为什么不允许..Integer Literal这里,所以编译器确保它将适应byte..所以它允许implicit转换..RHS将评估128哪些不能容纳byte.. 再次失败 ..最后两种情况与常规变量不同......由于它们已声明final,因此无法重新初始化.因此,编译器可以根据指定的值做出决定.
在这种情况下,编译器会看到,finalVarInt2包含值3.因此,RHS评估为64,可以容纳在LHS的byte变量中.现在,因为变量是无法更改的,并且知道这一点,所以确定t*他的值总是*..所以编译器允许这样做.finalCompiler64
在最后一种情况下,值为finalVarInt34 ..类似推理..不适合LHS,因为RHS评估为128,不适合byte
| 归档时间: |
|
| 查看次数: |
5598 次 |
| 最近记录: |