首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >processor:#if比较两个值

processor:#if比较两个值
EN

Stack Overflow用户
提问于 2018-09-06 17:35:19
回答 1查看 131关注 0票数 2

我正在为ATmega168微控制器设置一个通用异步收发器。我的第一个代码不起作用。在检查时,我发现了一个在工作程序中使用的头文件。它使用预处理器指令。

它对我来说非常混乱,所以我决定在c编译器中运行它并检查输出。

代码语言:javascript
复制
#include <stdio.h>

#define F_CPU 1000000UL

#ifndef BAUD                          /* if not defined in Makefile... */
#define BAUD  9600                     /* set a safe default baud rate */
#endif

#define BAUD_TOL 2
#define UBRR_VALUE (((F_CPU) + 8UL * (BAUD)) / (16UL * (BAUD)) -1UL)

#if 100 * (F_CPU) > (16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) + (BAUD) * (BAUD_TOL))
#define USE_2X 1
#define TEST 1

#elif 100 * (F_CPU) < (16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL))
#define USE_2X 1
#define TEST 11

#else
#define USE_2X 0
#define TEST 111

#endif


int main(void) {

    printf("UBRR_VALUE: %ld\n", UBRR_VALUE);
    printf("USE_2X: %d\n", USE_2X);
    printf("%ld\n", (16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL)));
    printf("F_CPU * 100 = %ld\n", (100*F_CPU));
    printf("TEST = %d\n", TEST);
    return 0;
}

输出:

代码语言:javascript
复制
UBRR_VALUE: 6
USE_2X: 1
105369600
F_CPU * 100 = 100000000
TEST = 11

由于100 * F_CPU小于(16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL)),因此TEST的值为11。

但如果我将F_CPU更改为16000000UL

代码语言:javascript
复制
UBRR_VALUE: 103
USE_2X: 0
1565491200
F_CPU * 100 = 1600000000
TEST = 111

这也是100 * F_CPU(16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL))小的原因。

但是为什么TEST是111呢?

编辑:*Here的100 * F_CPU大于(16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL))

EN

回答 1

Stack Overflow用户

发布于 2018-09-06 18:36:22

这些宏被展开,如下所述:

对于第二种情况,从F_CPU16000000UL (较大的值)

代码语言:javascript
复制
100 * (F_CPU) > (16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) + (BAUD) * (BAUD_TOL)) 

计算结果为0x5f5e1000 > 0x611e8000,为false

代码语言:javascript
复制
100 * (F_CPU) < (16 * ((UBRR_VALUE) + 1)) * (100 * (BAUD) - (BAUD) * (BAUD_TOL))

计算结果为0x5f5e1000 < 0x5d4f8000,也为false。

因此,以下宏是适用的:

代码语言:javascript
复制
#define USE_2X 0
#define TEST 111
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52201039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档