разные результаты в java и c # для оператора сдвига вправо

#c# #java #operators

#c# #java #операторы

Вопрос:

Где код:

c#

 private void button1_Click(object sender, EventArgs e)
{
  int a = -33554432;
  byte b = (byte)(a >> 24);
  MessageBox.Show(b.ToString());
}
  

java

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    int a = -33554432;
    byte b = (byte)(a >> 24);
    JOptionPane.showMessageDialog(null, Byte.toString(b));
}
  

Я читал об этой проблеме, и я считаю, что есть относительно простой способ понять другое поведение, но мне нужна небольшая помощь в достижении этого понимания. Есть желающие, пожалуйста?

Большое спасибо!

РЕДАКТИРОВАТЬ: хорошо, теперь используем Byte.toString() . Вывод для c # = 254 java = -2

Комментарии:

1. Любопытно, Integer.toString() на байте в Java? Почему бы и нет Byte.toString() ?

2. Вы также могли бы предоставить нам output .

Ответ №1:

Java byte подписан, поэтому >> будет заполнять 1 биты слева, если число отрицательное.

C # byte беззнаковый, поэтому >> оператор заполняет 0 биты.

Либо измените byte на sbyte в вашем коде C #, либо используйте >>> в Java.

Ответ №2:

Байт в Java — это значение со знаком. В этом случае вы могли бы просто использовать:

 // Note the triple >
int b = a >>> 24;
  

Альтернативно:

 byte b = (byte) (a >> 24);
int c = b amp; 0xff;
  

Комментарии:

1. Спасибо, Джон, альтернативная часть — это ответ. Будет помечен как таковой через минуту. >>> не работает (с указанным кодом), что было одной из причин, по которой я спросил здесь.

2. @ShunyataKharg: Когда вы говорите «>>> не работает» — что произошло, когда вы попытались? Все должно быть хорошо.

Ответ №3:

Попробуйте использовать в Java >>> . Это приводит к битовому сдвигу без учета знакового бита.

Комментарии:

1. Я почти уверен, что нет оператора <<< .