繁体   English   中英

为什么将int a = 1左移31位然后右移31位,它变为-1

[英]why shift int a=1 to left 31 bits then to right 31 bits, it becomes -1

给定

int a = 1; 00000000000000000000000000000001 ),

我所做的只是

a=(a<<31)>>31;

我假设在此语句之后a仍应为1 (我认为没有改变)。 但是,结果为-111111111111111111111111111111111 )。 有人知道为什么吗?

您缺少的是在C ++中右移>>是实现的定义。 对于有符号值,它可以是逻辑移位或算术移位。 在这种情况下,它会从左侧移1 s,以保留移位值的符号。 通常,您希望避免对有符号值进行移位,除非您确切地知道它们将为正数或移位实现无关紧要。

分步查看:

#include <cstdio>
using namespace std;

int main()
{
    int a = 1;
    printf("%d = %x\n", a, a);
    a <<= 31;
    printf("%d = %x\n", a, a);
    a >>= 31;
    printf("%d = %x\n", a, a);
    return 0;
}

输出:

1 = 1
-2147483648 = 80000000
-1 = ffffffff

1一直移到最高位,这使其变为负数。 向后移会触发符号扩展,以保持负数。

将a的声明更改为unsigned int a ,您将获得预期的行为。

“但是结果是-1

您使用unsigned int来查看仅大于0 32位值:

 unsigned int a = 1; 
 a=(a<<31)>>31;  

这是一个有符号的移位,因此最左边的位将被扩展。 这样,总数就位于0的同一侧。

左移那么多,您会将最低位放入符号位,最后得到负数。

然后,当您右移时,符号会扩展,将符号位复制到低31位。

如果您想知道最低位,请执行& 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM