有没有办法在 C 中存储乘法 int64_t * int64_t 的低 64 位?
Is there a way to store lower 64 bits of multiplication int64_t * int64_t in C?
这是我需要用C实现的功能。
请注意,不允许使用 gcc 内置函数。
感谢您的帮助!
'''
imull(int64_t a, int64_t b, int64_t *res) {
// a * b = ..64bits..|..64bits..
// *res
*res = a * b;
}
'''
当一个int64_t
乘以一个int64_t
时,真正的算术结果是一个128位的数字,其符号位在第127位。低64位不包含符号位.因此,乘法的低 64 位应该在 uint64_t
中返回,而不是 int64_t
,这可以通过以下方式完成:
imull(int64_t a, int64_t b, uint64_t *res)
{
*res = (uint64_t) a * (uint64_t) b;
}
(转换避免乘法溢出,因为无符号整数算术被定义为换行,而不是溢出。)
如果位必须在 int64_t
中返回,这可以通过 C 标准定义的方式使用:
imull(int64_t a, int64_t b, int64_t *res)
{
uint64_t temporary = (uint64_t) a * (uint64_t) b;
memcpy(res, &temporary, sizeof *res);
}
(memcpy
在 <string.h>
中声明。)
另请注意,如果真正的算术结果符合int64_t
,则上述代码返回的int64_t
将等于真正的算术结果。 (这是 属性 的二进制补码表示,int64_t
使用。)
这是我需要用C实现的功能。 请注意,不允许使用 gcc 内置函数。 感谢您的帮助!
'''
imull(int64_t a, int64_t b, int64_t *res) {
// a * b = ..64bits..|..64bits..
// *res
*res = a * b;
}
'''
当一个int64_t
乘以一个int64_t
时,真正的算术结果是一个128位的数字,其符号位在第127位。低64位不包含符号位.因此,乘法的低 64 位应该在 uint64_t
中返回,而不是 int64_t
,这可以通过以下方式完成:
imull(int64_t a, int64_t b, uint64_t *res)
{
*res = (uint64_t) a * (uint64_t) b;
}
(转换避免乘法溢出,因为无符号整数算术被定义为换行,而不是溢出。)
如果位必须在 int64_t
中返回,这可以通过 C 标准定义的方式使用:
imull(int64_t a, int64_t b, int64_t *res)
{
uint64_t temporary = (uint64_t) a * (uint64_t) b;
memcpy(res, &temporary, sizeof *res);
}
(memcpy
在 <string.h>
中声明。)
另请注意,如果真正的算术结果符合int64_t
,则上述代码返回的int64_t
将等于真正的算术结果。 (这是 属性 的二进制补码表示,int64_t
使用。)