我需要使用C语言中的64位变量来实现操作。尽管如此,嵌入式系统仅允许不超过32位的操作。
例如,也许我需要将64位变量拆分为32位,应用该操作,然后将值返回64位。

请检查以下伪代码:

函数Add()

        sint64 or uint64 A
        sint32 or uint32 B
        sint64 Result

        Result = A + B
        return Result


观察:“添加”没有防止溢出的保护。

您愿意在这个问题上帮助我吗?

最佳答案

快速尝试。
有两个32位无符号整数:ahi,alo(分割为64 uint)

uint32 ahi, alo;
void add_to_a(uint32 b) {
  if (b==0) return;  // adding 0 to a number does not change it
  alo = alo+b;       // alo should not be less than b now, so...
  if (alo<b) ahi++;  // check for carry (overflow)
    // if carry, increment ahi
}


上面唯一棘手的部分是在添加下部时检查是否有进位。 CPU具有执行此操作的内部机制,但在这里我求助于另一个想法。还要注意测试“如果(b == 0)返回;”是相当多余的,但可以派上用场。

通常,您可以设计其他运算符(-,*,/),以考虑我们都学到的知识。如果您知道如何手动进行操作,则可以将其转换为C语言,以为我们可以将长数字分解为数字。我们的头脑使用从0到9的数字,C程序可以使用8位或16位或32的数字。上面的代码段是手动方法的直接翻译,以添加两个数字:我们从最后一位开始到右边,将它们求和,然后查看总和是否适合一位数。如果是,我们记下数字并传递到左侧的下一个数字。否则,我们记下余数(“适合数字的位数”)并使用进位。上面的代码片段更加简单,因为我们知道两个数字分别由2位和1位组成。

可以进行相同的除法(复制“手动”方法),但是必须使用一些位移位。或者,如果您不介意浪费时间,只需计算可以从一个数中减去一个数的次数即可。这很粗鲁,但是正确:-)

关于c - 在32位系统(sint/uint)中的32位和64位之间进行操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41899118/

10-09 21:31