访问位以设置位字段时发生 C++ 转换错误

问题描述 投票:0回答:1

我们使用位域来表示从设备读取的寄存器元素。

#include <cstdint>

struct Register {
  uint8_t field : 1;
};

int main() {
  uint8_t byte{0}; // Read from a device
  Register r;
  r.field = (byte >> 5) & 0x1; // access bit 5
  r.field = (byte >> 7) & 0x1; // access bit 7, warns
}

我们也使用旗帜,

-Werror=conversion
。由于某种原因,访问位 0 到 6 会在没有警告的情况下进行编译。但是,访问位 7 会发出转换警告
error: conversion from 'unsigned char' to 'unsigned char:1' may change value [-Werror=conversion]

有什么想法吗?或者如何以不会警告转换错误的方式纠正它?

这里的例子,https://godbolt.org/z/ToM191e4q

c++ embedded bit-manipulation
1个回答
0
投票

您收到 1 个警告而不是 2 个或 0 个警告,这确实很奇怪。

但是既然您询问如何删除警告,请将值转换为

bool

r.field = ((byte >> 7) & 0x1) != 0; // access bit 7

r.field = bool((byte >> 7) & 0x1); // access bit 7
© www.soinside.com 2019 - 2024. All rights reserved.