Ранее я задал этот вопрос и получил ответ, который работал для приведенного мной примера, но, похоже, не обобщается на побитовое ИЛИ . Вот пример из этого вопроса, но с добавлением побитового ИЛИ.
#include <stdint.h>
struct MaskAndCount{
uint64_t occupied : 56;
uint8_t numOccupied : 8;
};
int main(){
int count = 7;
MaskAndCount foo;
foo.occupied &= ~(1L << count) & 0x00FFFFFFFFFFFFFF;
foo.occupied |= (1L << count) & 0x00FFFFFFFFFFFFFF;
}
Теперь, когда мы компилируем, мы не получаем предупреждение из первой строки, но получаем предупреждение из второй строки.
g++ -Wconversion Main.cc
Main.cc: In function ‘int main()’:
Main.cc:12:18: warning: conversion to ‘long unsigned int:56’ from ‘long unsigned int’ may alter its value [-Wconversion]
foo.occupied |= (1L << count) & 0x00FFFFFFFFFFFFFF;
Снова задам те же два вопроса.
- Будет ли преобразование, как написано, иметь желаемый эффект усечения старших битов значения справа?
- Есть ли способ отключить предупреждение локально или выразить то же поведение с другим синтаксисом, который не вызывает предупреждение?