我正在通过将一些 C++ 函数移植到 .NET 的 BigInteger 来独立研究位移。我注意到当我移动 BigInteger 时,空白被填充了。
我相信这与以二进制补码形式存储的负数有关。
BigInteger num = -126;
compactBitsRepresentation = (uint)(int)(num << 16);
这是移位后发生的事情(首先是最高有效位)
10000010 will be shifted 16
11111111100000100000000000000000 was shifted 16
我是否应该总是期望类似的位移操作以这种方式起作用?这是否与 OpenSSL 等“bigNumber”的不同语言和实现一致?