【发布时间】:2020-09-03 23:38:17
【问题描述】:
/* --- PRINTF_BYTE_TO_BINARY macro's --- */
#define PRINTF_BINARY_PATTERN_INT8 " %c%c%c%c%c%c%c%c"
#define PRINTF_BYTE_TO_BINARY_INT8(i) \
(((i) & 0x80ll) ? '1' : '0'), \
(((i) & 0x40ll) ? '1' : '0'), \
(((i) & 0x20ll) ? '1' : '0'), \
(((i) & 0x10ll) ? '1' : '0'), \
(((i) & 0x08ll) ? '1' : '0'), \
(((i) & 0x04ll) ? '1' : '0'), \
(((i) & 0x02ll) ? '1' : '0'), \
(((i) & 0x01ll) ? '1' : '0')
#define PRINTF_BINARY_PATTERN_INT16 \
PRINTF_BINARY_PATTERN_INT8 PRINTF_BINARY_PATTERN_INT8
#define PRINTF_BYTE_TO_BINARY_INT16(i) \
PRINTF_BYTE_TO_BINARY_INT8((i) >> 8), PRINTF_BYTE_TO_BINARY_INT8(i)
#define PRINTF_BINARY_PATTERN_INT32 \
PRINTF_BINARY_PATTERN_INT16 PRINTF_BINARY_PATTERN_INT16
#define PRINTF_BYTE_TO_BINARY_INT32(i) \
PRINTF_BYTE_TO_BINARY_INT16((i) >> 16), PRINTF_BYTE_TO_BINARY_INT16(i)
#define PRINTF_BINARY_PATTERN_INT64 \
PRINTF_BINARY_PATTERN_INT32 PRINTF_BINARY_PATTERN_INT32
#define PRINTF_BYTE_TO_BINARY_INT64(i) \
PRINTF_BYTE_TO_BINARY_INT32((i) >> 32), PRINTF_BYTE_TO_BINARY_INT32(i)
/* --- end macros --- */
我从 BitField.cpp 得到了上面的代码。
当我使用 cc 编译器编译代码时,我得到了以下警告。
警告:移位计数 >= 类型 [-Wshift-count-overflow] 的宽度 PRINTF_BYTE_TO_BINARY_INT64(n));
警告是从“ PRINTF_BYTE_TO_BINARY_INT32((i) >> 32), PRINTF_BYTE_TO_BINARY_INT32(i)”生成的。如果将“>> 32”更改为“>> 31”或任何小于 32 的数字,警告就会消失。但是,我需要右移 32 位,结果是正确的。只是警告很烦人。我想知道可能有一些方法可以修复代码,以便警告消失。
除了关闭和忽略警告之外,还有什么办法绕过这个警告吗?
【问题讨论】:
-
如何将
i转换为适当的 64 位类型? -
警告可能是准确的,代码可能真的不正确。
n的类型是什么? -
正如 PJ 建议的那样,转换为适当的类型将消除警告。加上我的两分钱,如果您不关心有符号或无符号值,我建议您转换为 uint64_t 。使用 uint64_t 将为您提供原始二进制模式。