【发布时间】:2010-09-29 21:44:25
【问题描述】:
我正在查看有关按位运算的 F# 文档:
按位右移运算符。这 结果是第一个带有位的操作数 右移的位数 第二个操作数。位移开 最不重要的位置不是 旋转到最重要的 位置。对于无符号类型,最 有效位填充 零。对于有符号类型,最 有效位用 1 填充。 第二个参数的类型是 int32.
与 MSB 用零填充的 C++ 语言(可能还有 C)相比,这种设计选择背后的动机是什么?例如:
int mask = -2147483648 >> 1; // C++ code
-2147483648 =
10000000 00000000 00000000 00000000
并且掩码等于 1073741824
1073741824 =
01000000 00000000 00000000 00000000
现在,如果您在 F#(或 C#)中编写相同的代码,这确实会用 1 填充 MSB,您将得到 -1073741824。
-1073741824 =
11000000 00000000 00000000 00000000
【问题讨论】:
-
在 C 和 C++ 中,标准中没有定义移位负值的结果。
-
@Oli:啊,我明白了,所以这就是原因
-
顺便说一句,这句话听起来有点奇怪。当然应该说“对于负值,最重要的位用1填充”?
-
所以我的问题应该更多:为什么 C 和 C++ 没有定义带符号的右移语言?
-
@Stringer:因为 C/C++ 不需要 2 的补码整数。很多事情都是官方未定义的行为,因为它们在 1 的补码硬件上的工作方式不同,这非常令人讨厌。 C也不需要每字节8位。在大多数特定的 C 实现中,对有符号整数进行右移使用算术移位,即移入符号位的副本。
标签: c# c++ f# history bit-shift