问题描述
我被分配了一个使用有符号乘法器执行无符号乘法的任务。尽管进行了多次尝试,但我还是听不到。可以这样做吗?
代码:
#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,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;
}
解决方法
分配short int b=0xc000;
本身已经实现了定义(视频:ISO / IEC 9899:2018 6.3.1.3 p。3),需要分两部分b = b1 * 2^15 + b0 = 0x1*2^15 + 0x4000
(假设{{ 1}})。如果您在这两个部分中都这样做,并且以一种使结果为无符号数据类型的方式理解赋值,请对结果使用SHRT_MAX + 1 == 32768
和a*b == (a1 * 2^15 + a0) * (b1 * 2^15 + b0)
临时变量来进行unsigned int ret2
其余的。
假设输入受限于signed int
的功能(由于unsigned short int
,unsigned
的功能),并且所有类型都必须是带符号的类型,输出除外:>
0xc000
为了保持礼貌,作业的定义还不够明确,但是由于我不知道这是您的错,老师的错还是变焦连接不良,我试图为您提供一些指导。如果不是那么麻烦,那么您现在至少应该能够提出正确的问题。