gpt4 book ai didi

c - 如何正确地添加/减去一个 128 位数字(作为两个 uint64_t)?

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:51 25 4
gpt4 key购买 nike

我正在使用 C 语言工作,需要对一个 64 位数字和一个 128 位数字进行加减运算。结果将保存在 128 位数字中。我正在使用一个整数数组来存储 128 位数字的上半部分和下半部分(即 uint64_t bigNum[2],其中 bigNum[0] 是最不重要的).

谁能帮忙做一个加法和减法函数,它可以接受 bigNum 并向其添加/减去 uint64_t

我在网上看到很多不正确的例子,所以考虑一下:

bigNum[0] = 0;  
bigNum[1] = 1;
subtract(&bigNum, 1);

此时 bigNum[0] 应该设置所有位,而 bigNum[1] 应该没有位设置。

最佳答案

在许多架构中,添加/减去任意长度的整数非常容易,因为有一个 carry flagadd/sub-with-flag 指令。例如在 x86 上 rdx:rax += r8:r9 可以这样做

add rax, r9    # add the low parts and store the carry
adc rdx, r8 # add the high parts with carry

在 C 中无法访问此进位标志,因此您必须自己计算该标志。最简单的方法是检查unsigned 和是否小于任一操作数 like this .例如做 a += b 我们会做

aL += bL;
aH += bH + (aL < bL);

正是在没有 flag register 的架构中如何完成多词添加.例如在 MIPS 中它完成了 like this

    # alow = blow + clow
addu alow, blow, clow
# set tmp = 1 if alow < clow, else 0
sltu tmp, alow, clow
addu ahigh, bhigh, chigh
addu ahigh, ahigh, tmp

这是一些 example assembly output

关于c - 如何正确地添加/减去一个 128 位数字(作为两个 uint64_t)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4757338/

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