首页 > 解决方案 > C中的左移运算符给出奇怪的结果

问题描述

我有以下程序:

int main()
{
    int64_t a = 241294423792285589;
    printf("a = %lld, a << 63 = %lld", a, a << 63);
    return 0;
}

我原以为a << 63是 0,但它打印出来:

a = 241294423792285589, a << 63 = -9223372036854775808

为什么是这样?

标签: cbit-shift

解决方案


如果将这些整数转换为有符号 2 的补码二进制,您会明白原因:

二进制的 241294423792285589 是

0000001101011001010000000000000000000000011010111111011110010101

将此左移 63 个点将导致最右边的1最终以最左边的二进制数字结尾:

1000000000000000000000000000000000000000000000000000000000000000

在 2 的补码二进制中是 -9223372036854775808。

您可以在线找到二进制 <-> 十进制转换器(例如这个:https ://www.rapidtables.com/convert/number/decimal-to-binary.html ),这有助于使这一点更加清晰。

或者你甚至可以试试这个位移计算器:https ://bit-calculator.com/bit-shift-calculator


推荐阅读