基本乘法代码不起作用

时间:2015-09-14 22:56:15

标签: 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) { 

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

    printf("the product is %d\n", c);
    return 0;
}

当输入的第一个整数为正/负且第二个为正数时,它有效。但是当输入的第二个整数是负数时,它会不间断地运行。

2 个答案:

答案 0 :(得分:1)

当您对负数进行位移时,您永远不会达到0。

r = r >> 1; // if r is negative, this will never be 0

这是由于大多数C实现中negative numbers are stored的方式。 您可以通过执行以下操作进行验证:

int a = -1 >> 1; // a == -1, not 0!

要解决您的问题,您需要先引入一个变量:

bool isNeg = r < 0;
if (isNeg)
{
    r = -r;
}

现在你可以像以前一样继续:

while (...) { }

不要忘记在while循环结束时更改乘法结果的符号:

if (isNeg)
{
    c = -c;
}

答案 1 :(得分:0)

正如其他人所说,负数的转变并不像你需要的那样发挥作用。

一些事情:

首先,你对l和r的转变的评论是向后的......你在评论转移时是正确的,当它离开时,并在它正确时离开。显然这只是评论。

要解决此问题,您需要使用&#34;特殊情况&#34;来回复r为否定。

if(r <0){r = -r; l = -l}

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

这&#39;纠正&#39;要求您测试移位r,同时保留结果的符号。