按位移位和字节转换在Java和C中给出了不同的结果#

按位移位和字节转换在Java和C中给出了不同的结果#,java,c#,.net,bit-manipulation,bit-shift,Java,C#,.net,Bit Manipulation,Bit Shift,我正在用C#和Java测试以下代码: int lngCRC = 3012; byte[] crc = new byte[2]; crc[0] = (byte)(lngCRC & 0xFF); crc[1] = (byte)(lngCRC >> 8); C#输出为: crc[0] = 196; crc[1] = 11; crc[0] = -60; crc[1] = 11; crc[0]=196; crc[1]=11; Java输出为: crc[0] = 196;

我正在用C#和Java测试以下代码:

int lngCRC = 3012;
byte[] crc = new byte[2];
crc[0] = (byte)(lngCRC & 0xFF);
crc[1] = (byte)(lngCRC >> 8);
C#输出为:

crc[0] = 196; crc[1] = 11; crc[0] = -60; crc[1] = 11; crc[0]=196; crc[1]=11; Java输出为:

crc[0] = 196; crc[1] = 11; crc[0] = -60; crc[1] = 11; crc[0]=-60; crc[1]=11; 如何在两种语言中获得相同的结果?

Java字节是有符号的(即介于-128和127之间)。我猜在C#中,它们是未签名的

二进制的3012是
00001011000100

更高的字节是11,不管它被视为有符号字节还是无符号字节

当您将低位字节11000100视为无符号字节时,它是196


当您将其视为有符号字节时,它是-60。

这一点。在C#中,
byte
的有符号等价物是
sbyte
(又名
System.sbyte
)。现在我改为sbyte,但在crc[1]中是0而不是11。问题是如何将Java代码翻译成C#代码并具有相同的输出。@Josef我刚刚测试过它,并且
var crc=new[](sbyte)(lngCRC&0xFF),(sbyte)(lngCRC>>8)};对我有用。那你一定是做错了什么。。。张贴你的C#代码。