我有以下程序:
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/