在C++中如何解释长整数的运算?

在C++中如何解释长整数的运算?,c++,c++11,operators,C++,C++11,Operators,输入 3. 2147483647 1. 0 输出 2147483648 4294967294 4294967295 上面的代码将数字反转,并将结果解释为无符号整数。为什么会这样?结果不应该是负数吗? 此外,如果我只对数字n使用否定运算符~而不是while循环,则打印的结果为负数 输出 -2147483648 -2 -一, 当执行上述操作时,数字的二进制表示形式是否相同?为什么会有不同的解释?第一种情况下未签名,第二种情况下已签名?当long替换为long时,生成的结果保持不变 有人能给我解释一下

输入 3. 2147483647 1. 0

输出 2147483648 4294967294 4294967295

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

输出 -2147483648 -2 -一,

当执行上述操作时,数字的二进制表示形式是否相同?为什么会有不同的解释?第一种情况下未签名,第二种情况下已签名?当long替换为long时,生成的结果保持不变


有人能给我解释一下这是如何工作的吗?

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

求反运算符会反转所有位


当您切换到long而不是long-long时,您将遇到麻烦。如果你的平台有一个32位长,这是最小的大小,但是C++允许越来越多的现实世界C++平台有64位长,那么你的循环将从最高的位位左移,这给实现依赖的结果可能改变了符号,然后最后通过环路将再一次移动,导致未定义的行为。

为什么不在循环中重新定义?@XcoderX:这似乎是个坏主意,不是吗?但是循环中的t隐藏了循环条件中的t。嗯,是的。可以
#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;
}