使用有符号乘法器进行无符号乘法

问题描述

我被分配了一个使用有符号乘法器执行无符号乘法的任务。尽管进行了多次尝试,但我还是听不到。可以这样做吗?

代码

#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 == 32768a*b == (a1 * 2^15 + a0) * (b1 * 2^15 + b0)临时变量来进行unsigned int ret2其余的。

假设输入受限于signed int的功能(由于unsigned short intunsigned的功能),并且所有类型都必须是带符号的类型,输出除外:>

0xc000

为了保持礼貌,作业的定义还不够明确,但是由于我不知道这是您的错,老师的错还是变焦连接不良,我试图为您提供一些指导。如果不是那么麻烦,那么您现在至少应该能够提出正确的问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...