我可以将任何宽度的无符号变量中的所有位设置为 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) 之类的东西乱扔源代码。