32位系统中32位和64位之间的操作(sint / uint)

时间:2017-01-27 16:55:04

标签: c embedded

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

请检查以下伪代码:

功能添加()

        sint64 or uint64 A
        sint32 or uint32 B
        sint64 Result

        Result = A + B
        return Result

OB的。 :"添加"没有防止溢出。

你介意帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

快速尝试。 有两个32位无符号整数: ahi alo (split 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有一个内部机制来做到这一点,但在这里我采取了另一种想法。另请注意,测试&#34; if(b == 0)返回;&#34;是多余的,但它可以很方便。

一般来说,你可以设计其他操作员( - ,*,/)思考我们所学到的东西。如果你知道如何手动操作,你可以用C语言翻译,认为我们在数字中打破了长数字。我们的思维使用从0到9的数字,C程序可以使用8位,或16位或32的数字。上面的代码片段是手动方法的直接转换,以添加两个数字:我们从最后的数字开始到对,总结,看看总和是否适合一位数。如果是,我们写下数字并传递到左边的下一个数字。否则我们写下余数(&#34;什么适合数字&#34;)并使用进位。上面的代码片段更简单,因为我们知道这两个数字分别由2位数和1位数组成。

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

答案 1 :(得分:-1)

我使用联盟结构找到了答案。它已经完成了。

提前谢谢!