【问题标题】:UL vs casting to unsigned longUL 与强制转换为无符号长
【发布时间】: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


【解决方案1】:

160000000UL(unsigned long) 160000000 有什么区别?

160000000UL 在预处理时未签名(unsigned long) 160000000 已签名。

当在预处理时在宏中使用常量时(例如#if math),宽度(int, long, long long)和强制转换无关紧要,因为使用的宽度是(u)intmax_tsign-ness 是相关的。


一般来说,除非needed,否则不要使用LLL 强制更宽的恒定宽度。需要签名时请使用U

转换为 (unsigned long) 或使用 L 可以强制常量至少为 64 位,而大约 160,000,000 的值只需要 32 位。使用过宽的类型会导致下转换警告。 IMO,编码人员经常忽略/禁用此类警告,因为它们被认为是嘈杂的 - 实际上它们很有用。

以下是可以的:

#define SYS_CLK ((unsigned long)(RCC_MAX_FREQUENCY) / 1000UL)

但我会推荐:

#define SYS_CLK (RCC_MAX_FREQUENCY / 1000u)

【讨论】:

  • 1000u和1000U有什么区别?
  • 如果我不使用 U 怎么办?只是(RCC_MAX_FREQUENCY / 1000)1000 是肯定的,1000u 也是肯定的。
  • @MohammadKholghi 1000u1000U 之间的差异是风格 - 相同的值 - 相同的类型。使用更清晰的。
  • @MohammadKholghi "1000 是正数,1000u" --> 不同类型的值相同。 intunsigned。启用良好的编译器可能会抱怨 RCC_MAX_FREQUENCY / 1000RCC_MAX_FREQUENCY / 1000u 的符号不匹配。
猜你喜欢
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
相关资源
最近更新 更多