gpt4 book ai didi

c - C中32位数字的乘法

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:32 24 4
gpt4 key购买 nike

为什么下面的代码会产生这个错误?

error: left shift count >= width of type [-Werror]

代码:

int32_t a,b;
int64_t apo;
a = 2673;
b = 19;
apo = BIG_MULL(a,b);
printf("\n %ld \n", apo );

找到的宏here :

#define WORD_MASK ((1<<16) - 1)
#define LOW_WORD(x) (x & WORD_MASK)
#define HIGH_WORD(x) ((x & (WORD_MASK<<16)) >> 16)
#define BIG_MULL(a, b) \
((LOW_WORD(a) * LOW_WORD(b)) << 0) + \
((LOW_WORD(a) * HIGH_WORD(b)) << 16) + \
((HIGH_WORD(a) * LOW_WORD(b)) << 16) + \
((HIGH_WORD(a) * HIGH_WORD(b)) << 32)

我正在尝试乘以 32 位的有符号值。目标机器不支持 64 位数学。

最佳答案

假设您正在尝试在您的宏中手动将两个 32 位 int 乘以 64 位结果,

((HIGH_WORD(a) * HIGH_WORD(b)) << 32

移动超出了 int 的长度,所以你有那个错误。

如果你想让它工作,首先将 BIG_MULL 更改为一个函数,然后:

  1. 转换为long long 并执行乘法。 long long 在具有 32 位 int 的系统中通常足够长。
  2. 继续使用适当的结构进行模拟。

第二个有点微妙,但是可行。首先你需要操作 unsigned int 并且有

struct {
unsigned int low, high;
} bigmul_result;

然后执行您在宏中所做的操作,然后转动

((LOW_WORD(a)  * HIGH_WORD(b)) << 16) + \
((HIGH_WORD(a) * LOW_WORD(b)) << 16)

(((LOW_WORD(a)  * HIGH_WORD(b)) + (HIGH_WORD(a) * LOW_WORD(b))) << 16)

这样就很容易记住检查总和以查看是否设置了第 17 位。如果是,则将 high 加 1。

关于c - C中32位数字的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28886467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com