【发布时间】:2020-10-15 16:28:37
【问题描述】:
我被分配了使用有符号乘数执行无符号乘法的任务。尽管多次尝试,我无法得到它。可以这样做吗?
代码:
#include <stdio.h>
int main()
{
// Must be short int
short int a=0x7fff;
short int b=0xc000;
unsigned int res1;
signed int res2;
//unsigned multiplier
res1= (unsigned short int) a * (unsigned short int) b;
//signed multiplier
res2= (short int) a * (short int) b;
printf("res1: 0x%x %d \n res2: 0x%x %d\n",res1,res1,res2,res2);
return 0;
}
这是提供的代码。
电流输出:
res1: 0x5fff4000 1610563584
res2: 0xe0004000 -536854528
预期输出:
res1: 0x5fff4000 1610563584
res2: 0x5fff4000 1610563584
工作代码:
#include<stdio.h>
#include<conio.h>
int main()
{
short int a = 0x7fff;
short int b = 0x3000;
unsigned int unsignedRes;
signed int signedRes;
unsigned int ourRes;
// Unsigned Multiplier
unsignedRes = (unsigned short int) a * (unsigned short int) b;
// Signed Multiplier
signedRes = (short int) a * (short int) b;
// Our Code using SIgned Multiplier
ourRes = ((short int)a & ~(0xffffu << 16))*((short int)b & ~(0xffffu << 16));
printf("Expected: 0x%x\nSigned: 0x%x\nResult: 0x%x",unsignedRes,signedRes,ourRes);
getch();
return 0;
}
【问题讨论】:
-
目前还不清楚约束是什么。你可以使用带符号的 32 位乘法吗?或者你可以使用多个更小的乘法吗?规则是什么?
-
唯一给出的是使用有符号乘数并进行无符号乘法。这段代码显示了有符号乘数是什么。我们可以修改乘数,但不能执行任何无符号乘法。 @TomKarzes 对不起,如果我不能更清楚的话。
-
但由于唯一的限制是不要使用无符号乘数,我认为它可以进行多次小计算。
-
一种方法是将两个操作数都转换为
int。如果int在您的机器上是 32 位,那么这适用于很多情况。但是,如果结果 >= 2**31,则结果可能会溢出。您可以使用unsigned long long,如果它是 64 位,则可以让您获得正确的结果。但即便如此,如果您尝试将其转换为int,这似乎是问题的一个约束,它可能会溢出。最坏的情况是0xffff乘以0xffff。结果应该是0xfffe0001,它不能表示为带符号的 32 位整数。它可以表示为一个无符号的 32 位值。 -
所以不清楚你想如何处理这种情况。
标签: c integer unsigned-integer signed-integer