Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 两个负数的位和_C_Numbers_Sum_Bit Manipulation - Fatal编程技术网

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,}如何?