我需要在C语言中使用64位变量来实现一个操作。尽管如此,嵌入式系统仅允许不超过32位的操作。 例如,也许我需要将64位变量拆分为32位,应用操作并将值返回64位。
请检查以下伪代码:
功能添加()
sint64 or uint64 A
sint32 or uint32 B
sint64 Result
Result = A + B
return Result
OB的。 :"添加"没有防止溢出。
你介意帮我解决这个问题吗?
答案 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)
我使用联盟和结构找到了答案。它已经完成了。
提前谢谢!