c++ - 修复循环变量的 -Wconversion GCC 警告

标签 c++ c++11 gcc warnings gcc-warning

我想修复现有代码中的编译器警告,并遇到了以下免费函数:

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]

如何重构该代码以避免警告?我未能在循环中将 unsigned char 替换为 int,因为这会改变行为。

最佳答案

您可以替换 j <<= 1

 j = static_cast<unsigned char> (j << 1)

或者甚至

 j = static_cast<unsigned char> ((j << 1)&UCHAR_MAX)

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

关于c++ - 修复循环变量的 -Wconversion GCC 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31564356/

相关文章:

c++ - 使用 ifstream 检查 C++ 中的数据类型

c++ - 将临时 std::shared_ptr 插入到 std::map 中,这不好吗?

C++11:模板中的(递归)指针算术 (TMP)

c++ - 为什么在GCC上调用std::package_task失败

python - 如何解决: lto1: fatal error: bytecode stream in file '...' generated with LTO version 6. 0而不是预期的7.1

C++ 动态数组一维非动态

c++ - 引入参数化构造函数后显示 LNK 2019 未解析的外部符号的代码错误

c++ - 为什么 std::unique_ptr operator* 抛出而 operator-> 不抛出?

c++ - 对文件使用 fopen 时,matlab 在没有转储文件的情况下崩溃

c++ - QT - 检测按下了哪个按钮