如何在c中执行有符号右移(>;>;)?

如何在c中执行有符号右移(>;>;)?,c,bit-manipulation,signed,C,Bit Manipulation,Signed,如何在c中执行有符号右移? 比如-25>>3 我试着这样做: 10011001>>3==00010011 但结果是-4。这是有符号右移。在有符号移位中,负数(由最高位中的“1”标识)通常从左侧填充。(虽然这取决于特定的编译器。看起来这就是编译器正在做的。) 11100111 --> 11110011 --> 11111001 --> 11111100 听起来你要找的是一个未签名的移位。如果你使用(有符号字符)((无符号字符)-25)>>3)你可能会得到你想要的结果。这是一个有符号的右移。在有符号

如何在c中执行有符号右移? 比如-25>>3

我试着这样做: 10011001>>3==00010011

但结果是-4。

这是有符号右移。在有符号移位中,负数(由最高位中的“1”标识)通常从左侧填充。(虽然这取决于特定的编译器。看起来这就是编译器正在做的。) 11100111 --> 11110011 --> 11111001 --> 11111100

听起来你要找的是一个未签名的移位。如果你使用
(有符号字符)((无符号字符)-25)>>3)
你可能会得到你想要的结果。

这是一个有符号的右移。在有符号移位中,负数(由最高位中的“1”标识)通常从左侧填充。(虽然这取决于特定的编译器。看起来这就是编译器正在做的。) 11100111 --> 11110011 --> 11111001 --> 11111100


听起来你要找的是一个未签名的移位。如果您使用
(有符号字符)(((无符号字符)-25)>>3)
您可能会得到您想要的结果。

根据标准6.5.7p5

E1>>E2的结果是E1右移位E2位位置。如果E1具有无符号类型或E1具有有符号类型和非负值,则结果值为E1/2E2商的整数部分。如果E1具有有符号类型和负值,则结果值由实现定义

结果是实现定义的,您应该在那里查看它是如何定义的


假设两个补码和有符号右移,
-25
11100111
,将其移位3将导致
111111 00
,即
-4

根据标准6.5.7p5

E1>>E2的结果是E1右移位E2位位置。如果E1具有无符号类型或E1具有有符号类型和非负值,则结果值为E1/2E2商的整数部分。如果E1具有有符号类型和负值,则结果值由实现定义

结果是实现定义的,您应该在那里查看它是如何定义的


假设两个补码和有符号右移,
-25
11100111
,将其移位3将导致
111111 00
,即
-4

由于有符号整数的右移是根据我的经验定义的,因此结果取决于目标机器上算术移位的可用性。因为现在很难找到没有它的计算机或uC几乎总是算术右移的结果

来自维基百科:

由于有符号整数的右移是根据我的经验定义的,因此结果取决于目标机器上算术移位的可用性。因为现在很难找到没有它的计算机或uC几乎总是算术右移的结果

来自维基百科:

在这里,您可以找到与您的问题相关的好答案:-25在2的补码系统中不是10011001(即几乎所有的补码系统)。它是11100111。
10011001
base 2是99。示例“我像这样尝试过:10011001>>3==00010011”不清楚。在这里,您可以找到与您的问题相关的好答案:-25在2的补码系统中不是10011001(即几乎所有的问题)。它是11100111。
10011001
base 2是99。示例“我这样尝试过:10011001>>3==00010011”不清楚。OP的示例对应于
无符号uint8\t
,而不是
无符号short
。我的计算机中得到了-4,但11110011的小数点是115@chen如果它被转换回一个签名字符,我怀疑它将是-4。@interjay。你说得对。查尔,不短。我会修好的。但是
无符号uint8\u t
有点多余。:)负值的右移是如何操作的,实现在C中定义;C标准不要求符号扩展。OP的示例对应于
无符号uint8\t
,而不是
无符号short
115@chen如果它被转换回一个签名字符,我怀疑它将是-4。@interjay。你说得对。查尔,不短。我会修好的。但是
无符号uint8\u t
有点多余。:)负值的右移是如何操作的,实现在C中定义;C标准不要求符号扩展。