【发布时间】:2021-10-25 17:26:05
【问题描述】:
160000000UL 和 (unsigned long) 160000000 有什么区别?
问题:
我有一个#define,其中包含以下内容:
#define SYS_CLK (160000000UL / 1000UL)
SYS_CLK 因系统时钟而异。我想知道我是否可以将其更改为:
#define SYS_CLK ((unsigned long)(RCC_MAX_FREQUENCY/*get freq from the system. It returns e.g. 160000000U*/) / 1000UL)
而RCC_MAX_FREQUENCY定义为:
#define RCC_MAX_FREQUENCY 168000000U
它们是一样的吗?
(我检查了this,但这不是我的问题。)
【问题讨论】:
-
对于大多数实际用途,没有区别。但是,您修改后的
SYS_CLK宏可能不是编译时常量——这取决于RCC_MAX_FREQUENCY是否是编译时常量。' -
@JonathanLeffler
RCC_MAX_FREQUENCY也是一个宏。 -
但是什么样的宏呢?它是否评估为整数常量表达式?可能没关系。这可能是至关重要的。我不完全清楚你在担心什么。你为什么担心?
-
@MohammadKholghi 如果留下
unsigned,大家仍然可以使用它。仍然不清楚为什么需要long。 -
Mohammad Kholghi,
ULL使常量成为一些 unsigned 类型并且至少 与unsigned long long一样宽。UL使常量成为一些 unsigned 类型并且至少 与unsigned long一样宽。unsigned long至少是 32 位的。unsigned long可以是 32 位、64 位或深奥的 36 位实现等。
标签: c long-integer unsigned