我有以下程序:

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

这是为什么?

最佳答案

如果将这些整数转换为有符号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

关于c - C中的左移运算符给出奇怪的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56081782/

10-11 21:04