【发布时间】:2025-12-15 09:50:01
【问题描述】:
我想确定我理解如果两个不同宽度的整数相互按位或运算会发生什么。最明智的选择是用零填充较小的那个。我写了一个小程序来测试一下。
看看这个示例代码:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main(void)
{
uint32_t foo = 0x00000000;
uint8_t bar = 0xFF;
printf("%"PRIu32"\n", (foo | bar));
printf("%"PRIu32"\n", (bar | foo));
}
如果我的猜测是正确的,我应该会得到两次 255。当我运行它时,我得到了
255
255
这是可以安全依赖的预期和明确定义的行为吗?是否有一个链接解释了具有不同 int 宽度的位操作的所有行为?
【问题讨论】:
-
你不用
int,而是uint32_t。这是一个无符号整数类型,但不一定是unsigned int,也不一定是(signed) int。您还可以通过将错误的可变参数类型传递给printf来调用未定义的行为。为uint32_t使用正确的格式说明符(请参阅inttypes.h)! -
关于bitops:这应该可以通过非常简单的搜索在线找到或在每本C书中找到。
-
@Olaf 感谢您指出这一点。我不太擅长
printf。我在我的代码中编辑了它并得到了相同的结果,所以我将编辑我的帖子,以免分散我真正的问题。 -
请再读一遍!您现在使用了另一个错误的说明符。再次阅读我的评论。
-
@user3528438 实际上是
uint32_t和signed int中较宽的一个。
标签: c bit-manipulation language-lawyer bitwise-operators