微控制器上的二元算术

Binary Arithmetic on Microcontroller

本文关键字:二元 控制器      更新时间:2023-10-16

我在二进制算术过程中找到适当处理变量的信息很难。我目前正在努力在ATMEL ATTINY84微控制器上实现算法。我正在用C 进行编码。

我遇到的问题是,使用二进制算术,您最终可能会溢出,或者最终可能会出现一个比存储在其中的值大的可变大小。如果这让我与一个例子解释,我深表歉意。

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

从我通过Google搜索学到的知识中,如果将大小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;

如果我确实必须将4000存储在32位的变量中,我可以简单地将其传输到以下

的变量为16位的变量
uint16_t D;
uint32_t C
C=4000;
D=C; 

事先感谢您的帮助。

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

在您的情况下,操作将返回4000,可以存储在16位变量中,因此很好。

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。