我能否将任意宽度的无符号变量中的所有位设置为 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;
我是一名优秀的程序员,十分优秀!