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;
}