2017-01-27 193 views
-2

我需要用C语言实现一个使用64位变量的操作。尽管如此,嵌入式系统只允许不超过32位的操作。 例如,也许我需要将64位变量拆分为32位,然后应用操作并将值返回64位。32位系统中的32位和64位之间的操作(sint/uint)

请检查下面的伪代码:

功能添加()

 sint64 or uint64 A 
     sint32 or uint32 B 
     sint64 Result 

     Result = A + B 
     return Result 

观测值。 :“添加”不受溢出保护。

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

+0

'div()'不会像那样工作。这是计算机算法中最复杂的功能。 – 0andriy

+0

真的吗? 你的意思是不会使用我所说的Add()方法吗? –

+0

它不会。如果您尝试在32位平台上将64位值除以32或64位值,则不会那么简单。 – 0andriy

回答

-1

我发现使用联盟结构的答案都是不礼貌的,但正确的。已经完成了。

预先感谢您!

+0

这不是一个答案。 – linuxfan

0

快速尝试。 有两个32比特的无符号整数:AHIALO(分裂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有一个内部机制来做到这一点,但在这里我诉诸另一个想法。还要注意测试“if(b == 0)return”是相当多余的,但它可以很方便。

一般来说,您可以设计其他运算符( - ,*,/),思考我们都学到了什么。如果你知道如何手工操作,你可以用C语言翻译,认为我们打破数字的长数字。我们的思想使用的是从0到9的数字,C程序可以使用8位或16位或32的数字。上面的代码片段是手动方法的直接转换以添加两个数字:我们从最后几位开始到将它们总结起来,看看这个总和是否在一个数字中。如果是的话,我们记下这个数字,然后传给下一个数字。否则,我们写下余数(“什么适合数字”)并使用进位。上面的代码片段甚至更简单,因为我们知道这两个数字分别由2位数和1位组成。

可以使分区相同(复制“手动”方法),但必须使用一些位移位。或者,如果您不介意浪费时间,只需计算您可以从另一个数字中减去一个数字的次数。 :-)

相关问题