如何在c ++中解释长整数的操作?

时间:2018-01-21 05:28:13

标签: c++ c++11 operators

#include<iostream>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        int x=32;
        long long n;
        long long t=1;
        cin>>n;
        while(x--){
            n=(n^t);
            t=t<<1;
        }
        cout<<n<<endl;
    }
    return 0;
}

输入 3 2147483647 1 0

输出 2147483648 4294967294 4294967295

上面的代码反转了数字,并将结果解释为无符号整数。为什么这样?结果数字不应该是负数吗? 此外,如果我在数字n上仅使用否定运算符(〜),而不是while循环,则打印的结果为负数。

输出 -2147483648 -2 -1

执行上述操作时,数字的二进制表示是否相同?为什么它的解释不同?在第一种情况下未签名并在第二种情况下签名?当long long被long替换时,产生的结果保持不变。

有人可以向我解释这是如何运作的吗?

1 个答案:

答案 0 :(得分:1)

你一次一个地反转32位(为什么,XOR可以在一次操作中反转你选择的任何一组位)。因为long long始终至少为64位,这意味着您不会更改符号位。

否定运算符会反转所有位。

当您切换到long而不是long long时,您将遇到麻烦。如果您的平台具有32位long(这是最小大小,但C ++允许更多且许多实际C ++平台具有64位长),那么您的循环将从最高幅度位左移,它给出了一个依赖于实现的结果(可能会改变符号),然后最后一次循环将再次移动,导致未定义的行为。