我在看 F# doc on bitwise ops:
按位右移运算符。结果是第一个操作数的位右移了第二个操作数中的位数。从最低有效位置移出的位不会旋转到最高有效位置。对于无符号类型,最高有效位用零填充。对于有符号类型,最高有效位用 1 填充。第二个参数的类型是 int32。
与 MSB 用零填充的 C++ 语言(可能还有 C)相比,这种设计选择背后的动机是什么?例如:
int mask = -2147483648 >> 1; // C++ code
其中-2147483648 =
10000000 00000000 00000000 00000000
掩码等于 1073741824
其中 1073741824 =
01000000 00000000 00000000 00000000
现在,如果您在 F#(或 C#)中编写相同的代码,这确实会用一个填充 MSB,您将得到 -1073741824。
其中-1073741824 =
11000000 00000000 00000000 00000000