单片机的二进制算法

时间:2014-02-06 21:09:41

标签: c++ microcontroller

我无法在二进制算术期间找到有关正确处理变量的信息。我目前正致力于在Atmel ATTiny84微控制器上实现算法。我用C ++编写它。

我遇到的问题是,使用二进制算术可能会导致溢出,或者最终可能会出现大于存储在其中的值的可变大小。如果这令人困惑,我道歉,让我用一个例子来解释。

uint16_t A=500;
uint8_t B=8;
uint32_t C;

C=A*B;

根据我通过谷歌搜索获知的内容,如果将大小为M的变量乘以大小为N的变量,则会得到大小为M + N的变量。在上述情况下,C = 4000但M + N为24.然而,值4000可以适合16位。我可以简单地将C声明为16位,还是必须为32位,如上所示?

uint16_t A=500;
uint8_t B=8;
uint16_t C;
C=A*B;

如果我必须在一个32位的变量中存储4000,我可以通过以下方式将其简单地传输到16位的变量

uint16_t D;
uint32_t C
C=4000;
D=C; 

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

除非您明确指出,否则乘法不会返回比两个操作数更大的类型。该操作将所有变量转换为最大宽度,然后相乘。将16位int乘以8位int时,8位int将转换为16位int,然后两者将相乘。虽然在数学上结果可能大于16位,但操作只返回16位数。如果结果不适合16位空间,则将设置溢出标志(检查微控制器手册以了解如何检查)。

在你的情况下,操作将返回4000,可以存储在16位变量中,这样就可以了。

答案 1 :(得分:-1)

uint16_t A=500;
uint8_t B=8;
uint32_t C;

C=A*B;

它会将a和b提升到C的大小,然后进行数学计算。

uint16_t A=500;
uint8_t B=8;
uint16_t C;
C=A*B;

它会将a和b提升到C的大小,然后进行数学计算。

uint16_t D;
uint32_t C;
C=4000;
D=C; 

您可能会或可能不会收到警告,表示您试图将32位推入16位。

D=(uint16_t)C; 

将在没有警告的情况下剪掉低16位。两种情况都会导致低16位进入D。