关于补码
-
对于补码,可将其理解为时钟的正向和逆向拨动,存在的意义是便于计算机进行加减法的计算
-
假如有一个8位的计算机,1+(-1)=0,转化为二进制即为0000 0001+1111 1111=0000 0000
-
为什么负数的补码不是直接取反,而是正数原码取反加一?
举个栗子就明白啦~(看下图)
关于数据溢出
-
有符号整型的第一位是符号位,无符号整型的第一位是数据位
-
向上溢出:
有符号整型最大值为0111 1111 …(31个一),加一后为1000 0000 …(31个零),即有符号整型最小值-2147483647
无符号整型最大值为1111 1111 …(32个一),加一后为0000 0000 …(32个零),即无符号整型最小值0
-
向下溢出:
有符号整形最小值为1000 0000 …(31个零),减一后为0111 1111 …(31个一),即有符号整型最大值2147483647
无符号整型最小值为0000 0000 …(32个零),减一后为1111 1111 …(32个一),即无符号整型最大值4294967295
-
综上,使用无符号整型在此题中不易溢出
解法:
class Solution {
public:
int getSum(int a, int b) {
while(b!=0){
int temp=a^b;
b=(unsigned int)(a&b) << 1;
a=temp;
}
return a;
}
};