gpt4 book ai didi

c - ANSI C All-Bits-Set Type-Promotion Safe Literal with -Wsign-conversion

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:34 24 4
gpt4 key购买 nike

我能否将任意宽度的无符号变量中的所有位设置为 1,而不会使用相同的文字触发符号转换错误 (-Wsign-conversion)?

没有 -Wsign-conversion 我可以:

#define ALL_BITS_SET (-1)
uint32_t mask_32 = ALL_BITS_SET;
uint64_t mask_64 = ALL_BITS_SET;
uintptr_t mask_ptr = ALL_BITS_SET << 12; // here's the narrow problem!

但是对于 -Wsign-conversion 我很难过。

error: negative integer implicitly converted to unsigned type [-Werror=sign-conversion]

我试过 (~0) 和 (~0U) 但没有骰子。预处理器将第一个提升为 int,这会触发 -Wsign-conversion,而第二个不会提升超过 32 位,只会设置 64 位变量的低 32 位。

我运气不好吗?

编辑:澄清一下,我在整个项目的许多地方都使用了定义的 ALL_BITS_SET,所以我犹豫是否要在源代码中乱扔诸如 (~(uint32_t)0) 和 (~(uintptr_t)0) 之类的东西。

最佳答案

一个的补码将所有零变为一,反之亦然。

那么试试

#define ALL_BITS_SET (~(0))
uint32_t mask_32 = ALL_BITS_SET;
uint64_t mask_64 = ALL_BITS_SET;

关于c - ANSI C All-Bits-Set Type-Promotion Safe Literal with -Wsign-conversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17430796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com