这是我的代码:
#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;
}
当输入的第一个整数为正/负且第二个为正数时,它有效。但是当输入的第二个整数是负数时,它会不间断地运行。
答案 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,同时保留结果的符号。