修复循环变量的 -Wconversion GCC 警告
Fixing of a -Wconversion GCC warning for a loop variable
我想修复现有代码中的编译器警告并遇到以下免费函数:
std::uint16_t calculate_crc16(std::vector<unsigned char> const& kData) {
std::int32_t result{0};
// This nested loop iterates over each bit of the input data.
for (unsigned char const& kByte : kData) {
// TODO(wolters): Refactor to eliminate [-Wconversion] compiler warning.
for (unsigned char j{1}; j; j <<= 1) {
if (((result & 1) ? 1 : 0) ^ ((kByte & j) ? 1 : 0)) {
result >>= 1;
result ^= 0x9299;
} else {
result >>= 1;
}
}
}
return static_cast<std::uint16_t>(result);
}
TODO
注释下方的行引发了以下 GCC v4.7.1 警告:
warning: conversion to 'unsigned char' from 'int' may alter its value [-Wconversion]
如何重构该代码以避免警告?我在循环中用 int
替换 unsigned char
失败,因为这会改变行为。
您可以将 j <<= 1
替换为
j = static_cast<unsigned char> (j << 1)
或者甚至
j = static_cast<unsigned char> ((j << 1)&UCHAR_MAX)
但是,我发现您的代码可读性不是很好....也许您可以发表一些评论...
我想修复现有代码中的编译器警告并遇到以下免费函数:
std::uint16_t calculate_crc16(std::vector<unsigned char> const& kData) {
std::int32_t result{0};
// This nested loop iterates over each bit of the input data.
for (unsigned char const& kByte : kData) {
// TODO(wolters): Refactor to eliminate [-Wconversion] compiler warning.
for (unsigned char j{1}; j; j <<= 1) {
if (((result & 1) ? 1 : 0) ^ ((kByte & j) ? 1 : 0)) {
result >>= 1;
result ^= 0x9299;
} else {
result >>= 1;
}
}
}
return static_cast<std::uint16_t>(result);
}
TODO
注释下方的行引发了以下 GCC v4.7.1 警告:
warning: conversion to 'unsigned char' from 'int' may alter its value [-Wconversion]
如何重构该代码以避免警告?我在循环中用 int
替换 unsigned char
失败,因为这会改变行为。
您可以将 j <<= 1
替换为
j = static_cast<unsigned char> (j << 1)
或者甚至
j = static_cast<unsigned char> ((j << 1)&UCHAR_MAX)
但是,我发现您的代码可读性不是很好....也许您可以发表一些评论...