Arrays 加模128位数

Arrays 加模128位数,arrays,math,addition,subtraction,Arrays,Math,Addition,Subtraction,我有2个128位的数字。让它是相同的数字: A=282434364544378924672110924168367615433 B=282434364544378924672110924168367615433 有必要将它们相加为模数 340282366920938463460374607431768211337 为了表示128位的数字,我使用了两个64位数组 low_A = A.aa[0]; low_B = B.aa[0]; low_M = M.aa[0]; high_A = A.aa[1

我有2个128位的数字。让它是相同的数字:

A=282434364544378924672110924168367615433
B=282434364544378924672110924168367615433
有必要将它们相加为模数

340282366920938463460374607431768211337
为了表示128位的数字,我使用了两个64位数组

low_A = A.aa[0];
low_B = B.aa[0];
low_M = M.aa[0];
high_A = A.aa[1];
high_B = B.aa[1];
high_M = M.aa[1];
因此,选择下半部分和上半部分(我们可以粗略地说,通过这种方式,数字将呈现给第64个数字系统)。 问题是,当将数字A和B相加时,物理上会发生溢出。传输被执行到一个不存在的位,尽管二进制表示仍然为真。如果有转移,我们当然已经知道给定的数大于模。 那么我们如何向机器解释结果应该是什么呢

A+B-M

if (high_A <= ULLONG_MAX - high_B) flag_h = 0; else flag_h = 1;
if (flag_h) {
    int car = 0;
    high_A = high_A - high_M;
    high_B = high_B - high_M;
    high_C = high_A + high_B + high_M;
    if (low_C <= low_M)
    {
        low_C = low_M - low_C;
        low_C = ULLONG_MAX - low_C + 1;
        car = 1;
    }
    else { low_C = low_C - low_M; }
    high_C -= car;
}

我找到了问题的解决方案,开始从高阶减法,下面是代码

if (flag_h) 
{
    int car = 0;
    unsigned __int64 temp1,temp2;
    if (high_C < high_M)
    {
        temp1 = high_M - high_C;
        high_C = ULLONG_MAX - temp1 + 1;
    }
    else { high_C = high_C - high_M; }
    if (low_C < low_M) {
        temp2 = low_M - low_C;
        low_C = ULLONG_MAX - temp2 + 1;
        high_C--;
    }
    else { low_C = low_C - low_M; }
}
if(标志)
{
int car=0;
未签名的_int64 temp1,temp2;
如果(高C<高M)
{
temp1=高μM-高μC;
高C=ULLONG_MAX-temp1+1;
}
else{high_C=high_C-high_M;}
如果(低C<低M){
temp2=低μM-低μC;
低C=ULLONG_MAX-temp2+1;
高_C--;
}
else{low_C=low_C-low_M;}
}

嗨,艾拉特,欢迎来到堆栈溢出。如果你已经找到了自己问题的解决方案,欢迎你加入,但请将你的答案作为答案发布,而不是作为问题的一部分。另外,请用你正在使用的语言标记你的问题;我假设它是C或C++,但是知道哪一个是很好的。请解释如何以代码的形式留下评论。不行!页面底部(页脚上方)应有一个蓝色的“回答您的问题”按钮。单击该选项,然后在出现的编辑框中键入答案。
if (flag_h) 
{
    int car = 0;
    unsigned __int64 temp1,temp2;
    if (high_C < high_M)
    {
        temp1 = high_M - high_C;
        high_C = ULLONG_MAX - temp1 + 1;
    }
    else { high_C = high_C - high_M; }
    if (low_C < low_M) {
        temp2 = low_M - low_C;
        low_C = ULLONG_MAX - temp2 + 1;
        high_C--;
    }
    else { low_C = low_C - low_M; }
}