C++ 基本乘法代码不工作

C++ 基本乘法代码不工作,c++,C++,这是我的密码: #include <stdio.h> int main( int argc, char **argv ) { int l, r, c; printf("Enter the integer:\n"); scanf("%d", &l); printf("Enter the integer:\n"); scanf("%d", &r); c = 0; // product while(r != 0

这是我的密码:

#include <stdio.h>

int main( int argc, char **argv ) {
    int l, r, c;

    printf("Enter the integer:\n");
    scanf("%d", &l);
    printf("Enter the integer:\n");
    scanf("%d", &r);

    c = 0; // product

    while(r != 0) { 

        if(r & '\x01' == 1) { 
          c = c + l; 
        }
        l = l << 1; 
        r = r >> 1;       
    }

    printf("the product is %d\n", c);
    return 0;
}
#包括
int main(int argc,字符**argv){
int l,r,c;
printf(“输入整数:\n”);
scanf(“%d”和“&l”);
printf(“输入整数:\n”);
scanf(“%d”、&r);
c=0;//乘积
而(r!=0){
如果(r&'\x01'==1){
c=c+l;
}
l=l>1;
}
printf(“产品是%d\n”,c);
返回0;
}

当输入的第一个整数为正/负,第二个整数为正时,该选项起作用。但是,当输入的第二个整数为负数时,它将不间断地运行。

当您对负数进行位移位时,您永远无法得到0

r = r >> 1; // if r is negative, this will never be 0
这是由于大多数C实现的方式。 您可以通过执行以下操作进行验证:

int a = -1 >> 1; // a == -1, not 0!
要解决问题,首先需要引入一个变量:

bool isNeg = r < 0;
if (isNeg)
{
    r = -r;
}
不要忘记在while循环结束时更改乘法结果的符号:

if (isNeg)
{
    c = -c;
}

正如其他人所说,负数的转变不会像你所需要的那样起作用

有几件事:

首先,你对l和r移位的评论是向后的……你是在评论左移位是右移位,右移位是左移位。显然,这只是评论

要解决这个问题,您需要用“特殊情况”来响应r为负值

如果(r<0){r=-r;l=-l}

现在循环工作,并产生正确的结果


这“纠正”了您测试移位r的要求,同时保留结果的符号。

您希望
r
在移位所有位后最终变为零。当有符号整数有符号位时,它会在移位前加上1而不是0。将定义从
intl,r,c
无符号整数l,r,c它应该按预期的方式工作。@alvits:OP似乎希望能够将负数相乘……@Hurkyl-Unsigned int可以保存有符号int的位表示形式。然而,换档时的行为有所不同。OP操作的位不是有符号整数。OP所期望的行为是无符号int行为。负数仍然有效,因为printf将使用
%d
而不是
%u
进行打印。如果有疑问,我鼓励您测试它。您应该学会使用调试器,您会立即看到r没有做您期望的事情。您应该提到,
r>>1
的结果是实现定义的。有些系统可能会填充零位或其他任何内容。用1位填充是最常见的。
if (isNeg)
{
    c = -c;
}