修复循环变量的 -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)

但是,我发现您的代码可读性不是很好....也许您可以发表一些评论...