我正在查看按位操作的F#文档:
按位右移运算符.结果是第一个操作数与第二个操作数右移。从最不重要位置移动的位不被旋转到最重要位置。对于无符号类型,最重要的位填充了零。对于有符号类型,最重要的位是填充的。第二个参数的类型是int32。
与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发布于 2010-09-29 22:02:52
回答改革后的问题(在评论中):
C和C++标准没有定义右移负值的结果(它不是实现定义的,也不是未定义的,我不记得是哪个)。
这是因为定义该标准是为了反映底层指令集的最低公分母。例如,如果指令集不包含asr原语,则执行真正的算术移位需要几个指令。由于标准规定了一人或两人的补语表示,这一情况进一步复杂化。
https://stackoverflow.com/questions/3826090
复制相似问题