いくつかの C++ 関数を .NET の BigInteger に移植することで、ビット シフトを独自に研究しています。BigInteger をシフトすると、空白が 1 で埋められていることに気付きました。
これは、負の数が 2 の補数形式で格納されていることに関係していると思います。
BigInteger num = -126;
compactBitsRepresentation = (uint)(int)(num << 16);
シフト後に何が起こったかを次に示します(最上位ビットが最初)
10000010 will be shifted 16
11111111100000100000000000000000 was shifted 16
同様のビットシフト操作がこのように動作することを常に期待する必要がありますか? これは、OpenSSL などの「bigNumber」のさまざまな言語や実装と一致していますか?