首页 > 解决方案 > 我可以使用“MAX”宏来检查是否所有位都已设置?

问题描述

我最近接受了一次采访,我不得不提出一个函数来检查 uint32_t 中的所有位是否都已设置。

我写了以下代码:

int checkStatus(uint32_t val) {
 return val == UINT32_MAX;
} 

我假设如果未设置一位,它将返回 0,如果两个值相同,则返回 1。

由于我在其他任何地方都没有看到此解决方案,因此我认为它是错误的。但我不明白为什么。当我这样做时,我在想:“如果所有位都设置为 1,那么该值应该是表示的最大无符号整数,否则不会。” 你能告诉我它是否不正确,为什么?

标签: cintegermaxcomparisonbit

解决方案


在这里使用的问题UINT32_MAX是“最大值”是一个算术概念,而不是按位逻辑概念。尽管UINT32_MAX实际上在大多数情况下都表示(无符号)数字 0xFFFFFFFF,但这只是数字以二进制补码算法表示的方式的结果。

在这里使用UINT32_MAX可能会误导读者,因为它具有算术的含义,而不是按位操作的含义。

在 C 编程中,我们都习惯将位模式表示为十六进制数字。数字“0xFFFFFFFF”立即表达了所有位都已设置的概念,但UNIT32_MAX实际上并没有。类似地,在算术表达式中使用值“0xFFFFFFFF”来表示“减 1”可能不合适,即使这些值在实践中是相同的。

因为我大部分时间都在寻找其他人的代码中的错误,所以我敏锐地意识到表达同一事物的不同方式在表达能力上的差异。有时我们因为效率低下而不得不写一些没有表现力的东西;但我认为我们不应该仅仅为了它而这样做。


推荐阅读