早些时候,我问过this question并收到了一个对我提供的示例有效的答案,但似乎没有概括为按位OR。以下是该问题的示例,但添加了按位OR。
#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;
同样,我将提出同样的两个问题。