다음 코드를 고려하십시오. 내가 -Wconversion
이 코드를 컴파일 할 경우더 넓은 정수 형식을 비트 필드로 안전하게 변환하려면 어떻게해야합니까?
#include <stdint.h>
struct MaskAndCount{
uint64_t occupied : 56;
uint8_t numOccupied : 8;
};
int main(){
int count = 7;
MaskAndCount foo;
foo.occupied &= ~(1L << count);
}
후 나는 다음과 같은 오류가 발생합니다.
g++ -Wconversion Main.cc
Main.cc: In function ‘int main()’:
Main.cc:11:18: warning: conversion to ‘long unsigned int:56’ from ‘long unsigned int’ may alter its value [-Wconversion]
foo.occupied &= ~(1L << count);
이 합법적 인 문제가 될 것 같다,하지만 내 원하는 동작은 오른쪽에있는 값을 모두 더 높은 비트를 잘라내는 정확하게이다.
내 질문은 두 가지입니다.
- 작성된대로 변환하면 오른쪽에있는 값의 상위 비트가 잘리는 효과가 있습니까?
- 경고를 로컬로 보내지 않거나 경고를 트리거하지 않는 다른 구문으로 동일한 동작을 나타내는 방법이 있습니까?
나는 다음과 같은 정적 캐스트를 시도했지만, 전혀 컴파일되지 않습니다.
static_cast<uint64_t:56>(~(1L << count))
유일한 옵션은 특정 경고를 끄는 것일 수 있습니다. 컴파일러를 어떻게 지정해야하는지 알고 싶다면. –
@MarkRansom, 불행히도이 문장은 템플릿 파일의 헤더 파일에 나타나며 라이브러리를 작성하고 있으므로 라이브러리의 모든 사용자에게 경고 메시지를 표시하지 않도록 설정해야합니다. 내 라이브러리를 사용해 볼 의향이있는 응용 프로그램 집합입니다. – merlin2011