我试图理解为什么BigInteger会抛出溢出异常。我试图通过将BigInteger转换为byte[]
并迭代地递增移位直到我看到异常发生的位置来将其可视化。
导致异常的代码
uint amountToShift2 = 12;
BigInteger num = new BigInteger(-126);
uint compactBitsRepresentation = (uint)(num >> (int)amountToShift2);
答案 0 :(得分:1)
关于您编辑过的问题:
uint amountToShift2 = 12;
BigInteger num = new BigInteger(-126);
uint compactBitsRepresentation = (uint)(num >> (int)amountToShift2);
位移正常并产生BigInteger
值-1
(负值)。
但转换为uint
会引发异常,因为-1
超出uint
的范围。从BigInteger
到uint
的转换并非“模糊”模2**32
,而只是抛出。
你可以通过以下方式解决这个问题:
uint compactBitsRepresentation = (uint)(int)(num >> (int)amountToShift2);
不会抛出unchecked
上下文(这是通常的上下文)。
答案 1 :(得分:0)
C#中的字节数组没有>>
或<<
位移运算符。您需要手动编写代码(注意掉落的位)。
答案 2 :(得分:0)
有些东西告诉我>>
运算符不能使用数组之类的引用类型,而是使用基本类型。
你的int
实际上由一系列字节表示,所以说
int i = 6;
i
表示为
00000000000000000000000000000110
>>
将所有位向右移动,将其更改为
00000000000000000000000000000011
或3
如果你真的需要移动字节数组,那么定义你自己的方法来移动数组的所有项目并不是非常困难。它会有 O(n)时间复杂度。