long value = 0x88888888 ;
int i = (int) (value & 0xff);
Как выполняется вышеуказанная оценка выражения? Это
int i = (int)value & (int)0xff ;
или выполняется сначала побитовая операция и операция? Я запутался: - |
Сначала побитовая операция оценивается как операция по длинным (ее скобка гарантирует). Затем результат преобразуется в int.
Давайте посмотрим на байт-код:
public static void main(java.lang.String[]);
Code:
0: ldc2_w #35 // long -2004318072l
3: lstore_1
4: lload_1
5: ldc2_w #37 // long 255l
8: land
9: l2i
10: istore_3
11: return
}
так как вы можете видеть, что шестнадцатеричный 0xff
сначала преобразован в long, а затем использует bitwise and
значение, маскируя его с помощью 0xff
после того, как он преобразуется в int
lload_1
загружает длинное значение из локальной переменной 1
ldc2_w
нажимает константу #index из постоянного пула (двойного или длинного) в стек
land
побитовая и двух длинl2i
преобразует long в int Сначала (value & 0xff);
будут решены. т.е. value(bitwise and)0xff.
то результирующий будет преобразован в значение int, используя тип casting int я = (int) (value & 0xff);
()
, оценивается до того, как что-то снаружи будет применено. Стандартное правило заключается в том, что более короткий операнд расширяется, чтобы соответствовать более длинному.i = 0x88