C 两个负数的位和
我希望有人能帮助我 如果我有两个正数,或者一个正数和一个负数,我有下面的算法。但是,如果这两个数字都是负数,它就不起作用了 有人能解释一下这是怎么可能的吗C 两个负数的位和,c,numbers,sum,bit-manipulation,C,Numbers,Sum,Bit Manipulation,我希望有人能帮助我 如果我有两个正数,或者一个正数和一个负数,我有下面的算法。但是,如果这两个数字都是负数,它就不起作用了 有人能解释一下这是怎么可能的吗 void sum (int p, int q) { int sum, carry; carry = 1; while (carry > 0) { sum = p ^ q; carry = p & q; carry = carry << 1; p = sum; q = ca
void sum (int p, int q) {
int sum, carry;
carry = 1;
while (carry > 0) {
sum = p ^ q;
carry = p & q;
carry = carry << 1;
p = sum;
q = carry;
}
p = p << 1;
p = p >> 1;
printf("The result equals to %d", p);
}
无效和(int p,int q){
整数和,进位;
进位=1;
while(进位>0){
总和=p^q;
进位=p&q;
进位=进位1;
printf(“结果等于%d”,p);
}
提前感谢大家:)两个负数之和为负数(除非出现溢出,如评论中所指出的)。但以下代码:
p = p << 1;
p = p >> 1;
p=p>1;
基本上是清除最上面的位,即符号位,因此其结果永远不会为负数。两个负数之和为负数(除非出现溢出,如注释中所述)。但此代码:
p = p << 1;
p = p >> 1;
p=p>1;
本质上是清除最顶端的位,即符号位,因此此操作的结果永远不会为负。请注意,左移负整数是未定义的行为。您的代码仅定义了非负数的非溢出和的语义。请注意,左移负整数是未定义的行为。您的代码仅定义了考虑到非溢出的非负数字的总和,考虑到溢出,C++中负数的和不是总是负的。我尝试添加一个校验:如果两者都是负数,则该代码不应该被执行,但是它不起作用。如果(p>0>q>0){p= p>1,}如何?考虑到溢出,在C++中,负数之和并不总是负的。我尝试添加一个校验:如果两者都是负数,则该代码不应该被执行,但它不起作用。如果(p>0×q>0){p= p>1,}如何?