2017-01-26 5 views
2

부호없는 형식립니다, 내가 한 일은이다 :대형 정수 암시 내가 비트 필드에서 가능한 최대 값을 결정하려고했다

using namespace std; 

struct A{ 
    unsigned int a:1; 
    unsigned int b:3; 
}; 

int main() 
{ 
    A aa; 
    aa.b = ~0U; 
    return 0; 
} 

MSVC 잘하지만 GCC 4.9.2 나에게 경고를 주었다

warning: large integer implicitly truncated to unsigned type [-Woverflow] 

내가 어떻게 제거 할 수 있는지 궁금합니다. (필드의 비트 폭을 알지 못한다고 가정하고, 가능한 최대 값을 알고 싶습니다.) 자신의 범위를 포함하는 비트 필드의 가치 표현의 측면, 현재 결함 C++에서 표준으로 간주되는 언어 표준에 underspecified 것을

aa.b = 1; 
aa.b = -aa.b; 

참고를 다음과 같이

+2

비트 필드는 휴대하지 않습니다. –

+0

@Neil Butterworth : 그들은 근본적인 유형의 표현을 다루는 C++ 언어 부분의 거의 모든 것만 큼 이식성이 떨어집니다. – AnT

+0

@An 아니요, 이식성이 훨씬 떨어집니다. –

답변

0

이 주위에 작업을 시도 할 수 있습니다 . 특히 문서의 다른 부분 (예 : 열거 유형 지정)이 자신의 목적을 위해 비트 필드의 표현 가능한 값의 범위에 의존하려고 시도하는 것을 고려하면 이상합니다. 이것은 taken care of in the future입니다.

+1

이것은 마침내 다음과 같이 사용하기로 결정한 작업과 유사합니다 : aa.b = 0; --aa.b; – stanleyli

+0

@stanleyli : 네, 네 것이 더 좋다. – AnT