右移运算符在java和c#中的结果不同

Shu*_*arg 0 c# java operators

BHere的代码:

C#

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

java的

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

我已经阅读了这个问题,我相信有一种相对简单的方法来理解不同的行为,但我需要一些帮助才能达到这种理解.请问有谁?

非常感谢!

编辑:好的,现在使用Byte.toString().c#的输出= 254 java = -2

ros*_*sum 6

Java byte已签名,因此如果数字为负数,则会从左侧>>填充1位.

C#byte是无符号的,因此>>运算符填充0位.

要么在C#代码中更改byte,要么在Java中sbyte使用>>>.


Jon*_*eet 5

Java中的字节是带符号的值.在这种情况下,您实际上可以使用:

// Note the triple >
int b = a >>> 24;
Run Code Online (Sandbox Code Playgroud)

或者:

byte b = (byte) (a >> 24);
int c = b & 0xff;
Run Code Online (Sandbox Code Playgroud)