正如其他人所提到的,当在带符号的int上右移时,实现将定义为1还是0。在您的情况下,因为1000的最左边的位是1,所以“替换位”也为1。假设您必须使用带符号的int,为了摆脱它,可以应用位掩码。
[当我在C ++中对1000使用按位运算符时,它将给出以下结果:1100。我希望结果为0100。当1处于任何其他位置时,这正是发生的情况,但是在前导1时会发生错误。为什么会这样,如何避免呢?
您描述的行为与some平台上发生的变化(当右移设置了高位的带符号整数(因此为负值)时。)>
[在这种情况下,在许多平台上,编译器将发出代码以执行arithmetic shift,该代码传播符号位;在带有2的负整数补码表示的平台上(实际上几乎每个当前平台),即使在负值上也具有“x >> i
= floor(x / 2 i
要提出您的问题,要获得“常规”移位行为(通常称为“逻辑移位”),必须确保对unsigned
整数进行运算。可以通过确保您要移动的变量为无符号类型(例如unsigned int
)来获得,也可以通过在其后加上U
后缀(例如1
为int
)来获得该变量。 1U
是unsigned int
)。
如果您拥有的数据属于带符号类型(例如int
),则可以在转换之前无风险地将其转换为相应的unsigned
类型(标准明确定义了从带符号的int到无符号的转换) ,并且不会更改2的补码机上的位值)。
正如其他人所提到的,当在带符号的int上右移时,实现将定义为1还是0。在您的情况下,因为1000的最左边的位是1,所以“替换位”也为1。假设您必须使用带符号的int,为了摆脱它,可以应用位掩码。
正如其他人所提到的,当在带符号的int上右移时,实现将定义为1还是0。在您的情况下,因为1000的最左边的位是1,所以“替换位”也为1。假设您必须使用带符号的int,为了摆脱它,可以应用位掩码。