C中32位数字的乘法
Multiplication of 32 bits numbers in C
为什么下面的代码会产生这个错误?
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
改成一个函数,然后:
- 转换为
long long
并执行乘法。 long long
在 32 位 int
. 系统中通常足够长
- 继续使用适当的结构进行模拟。
第二个有点微妙,但是可行。首先你需要在 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 位。如果是,请将 1 添加到 high
.
为什么下面的代码会产生这个错误?
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
改成一个函数,然后:
- 转换为
long long
并执行乘法。long long
在 32 位int
. 系统中通常足够长
- 继续使用适当的结构进行模拟。
第二个有点微妙,但是可行。首先你需要在 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 位。如果是,请将 1 添加到 high
.