Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java操作符mod result错误问题_Java - Fatal编程技术网

java操作符mod result错误问题

java操作符mod result错误问题,java,Java,我是一个java初学者。 我试图操作1字节,但%mod operation的值很奇怪。 代码如下: ArrayList<byte[]> bytelist; MessageDigest.GetInstance("MD5") String MD5 = new BigInteger(1,byteBuffer).toString(16); byte[] buffer = new byte[2]; System.arraycopy (byteBuffer,0, buffer

我是一个java初学者。 我试图操作1字节,但%mod operation的值很奇怪。 代码如下:

ArrayList<byte[]> bytelist;
MessageDigest.GetInstance("MD5")
String MD5 = new BigInteger(1,byteBuffer).toString(16);
byte[] buffer = new byte[2];
System.arraycopy (byteBuffer,0, buffer, 0, 2);
byte.add(buffer);


byte bOperand = 16;  // (0x10)
aOperand = (byte)(bytelist.get(0)[0] % bOperand); // == 213 == (0xD5)
System.out.println("after : " + String.format("%02x",aOperand));
arraylistbytelist;
MessageDigest.GetInstance(“MD5”)
字符串MD5=新的大整数(1,byteBuffer).toString(16);
字节[]缓冲区=新字节[2];
System.arraycopy(字节缓冲区,0,缓冲区,0,2);
字节。添加(缓冲区);
字节bOperand=16;//(0x10)
aOperand=(字节)(bytelist.get(0)[0]%bOperand);//=213==(0xD5)
System.out.println(“在“+String.format(“%02x”,aOperand)”之后);
结果:f5(12月11日)

expect:5

字节
s与Java中的所有数字类型一样,都是有符号的。所以没有表示213的字节-它会溢出到-43。

字节s与Java中的所有数字类型一样,都是有符号的。因此没有表示213的字节-它会溢出到-43。

Java的字节总是有符号的,所以它们的范围是-128到127。无符号字节213在Java中表示为-43(两者都有二进制表示11010101)

-43 mod 16是-11,这就是为什么会得到意外的结果

要对无符号字节进行操作,需要更大的数据类型,如
int
。您可以使用
Byte.toUnsignedInt
将有符号字节转换为正
int
,然后对其进行操作:

aOperand = (byte)(Byte.toUnsignedInt(aOperand) % 16);

Java的字节总是有符号的,所以它们的范围是-128到127。无符号字节213在Java中表示为-43(两者都有二进制表示11010101)

-43 mod 16是-11,这就是为什么会得到意外的结果

要对无符号字节进行操作,需要更大的数据类型,如
int
。您可以使用
Byte.toUnsignedInt
将有符号字节转换为正
int
,然后对其进行操作:

aOperand = (byte)(Byte.toUnsignedInt(aOperand) % 16);


请再次检查ma代码。获取MD5字符串并复制前2个字节。其中一个字节是mod操作的。还要注意:混合列表和数组的意义到底是什么。至少,当你认为mod运算符有问题时,为什么不给我们一个简单的例子:使用mod运算符?不要把你自己(和你的读者)和那些与你的问题无关的事情混淆起来。始终消化您的问题,并深入其核心。非常有用,谢谢您,请再次检查ma代码。获取MD5字符串并复制前2个字节。其中一个字节是mod操作的。还要注意:混合列表和数组的意义到底是什么。至少,当你认为mod运算符有问题时,为什么不给我们一个简单的例子:使用mod运算符?不要把你自己(和你的读者)和那些与你的问题无关的事情混淆起来。始终消化您的问题,并深入到问题的核心。非常有用,谢谢。有没有办法将1字节计算为无符号类型?我是C++开发者,所以我会给你一个简单的例子。无符号字符buff=0x21;buff%0x10;//==0x01我需要这个。非常有用,谢谢您。请参阅Sweeper的回答:
Byte.toUnsignedInt()
@worldstar在Java中很少有操作是在单个字节上进行的。大多数操作员在
int
long
float
double
上操作。请注意,即使
%=
似乎是在单字节上运行,但在
%
上仍会执行到
%
的二进制数字升级,并且结果会隐式转换回
字节
。是否有办法仅将1个字节计算为无符号类型?我是C++开发者,所以我会给你一个简单的例子。无符号字符buff=0x21;buff%0x10;//==0x01我需要这个。非常有用,谢谢您。请参阅Sweeper的回答:
Byte.toUnsignedInt()
@worldstar在Java中很少有操作是在单个字节上进行的。大多数操作员在
int
long
float
double
上操作。请注意,尽管
%=
似乎在单字节上运行,但在
%
上仍会执行到
int
的二进制数字升级,并且结果会隐式转换回
字节。非常有帮助,谢谢you@worldstar如果你认为我的答案回答了你的问题,请考虑通过点击这个标记接受它!非常有用,谢谢you@worldstar如果您认为我的答案回答您的问题,请考虑通过点击这个复选标记接受它!