서명 된 값이 서명되지 않은 정수에 할당 될 때 컴파일러가 오류를 제공하지 않는 이유는 무엇입니까? -C ++

StackOverflow https://stackoverflow.com/questions/765709

문제

알아요 서명되지 않은 int 음수 값을 보유 할 수 없습니다. 그러나 다음 코드는 오류/경고없이 컴파일됩니다.

unsigned int a = -10;

변수를 인쇄 할 때 , 나는 잘못된 가치를 인쇄한다. 서명되지 않은 변수가 서명 된 값을 보유 할 수없는 경우, 컴파일러가 오류/경고를 제공하지 않고 컴파일 할 수있는 이유는 무엇입니까?

이견있는 사람?

편집하다

컴파일러 : VC ++ 컴파일러

해결책

경고 레벨 4를 사용해야합니다.

도움이 되었습니까?

해결책

Microsoft Visual C ++ :

경고 c4245 : '초기화': 'int'에서 'signized int'로 변환, 서명/부호없는 불일치

경고 레벨 4에서.

G ++

나에게 경고를 준다 :

경고 : 음수 값의 변환 -0x00000000a' to서명되지 않은 int '

-W 지침없이.

GCC

사용해야합니다 :

gcc main.c -wconversion

경고를 줄 것입니다.

경고 : 부정적인 정수는 서명되지 않은 유형으로 암시 적으로 변환되었습니다

-벽은이 경고를 가능하게하지 않습니다.


어쩌면 경고 레벨을 올리면됩니다.

다른 팁

변환 a signed int an unsigned int C 표준에서 "일반적인 산술 변환"으로 알려져 있으므로 오류가 아닙니다.

컴파일러가 기본적으로 경고를 발행하지 않는 이유는 코드에서 일반적으로 수행되기 때문에 일반적으로 발행 된 '거짓 긍정적'경고가 너무 많기 때문입니다. 함께 작동하는 많은 코드가 있습니다. signed int 본질적으로 서명되지 않은 것들을 다루는 값 (예 : 버퍼 크기 계산). 표현에서 서명하고 서명되지 않은 값을 혼합하는 것도 매우 일반적입니다.

이러한 조용한 전환은 버그에 대한 책임이 없다고 말하는 것은 아닙니다. 따라서 새 코드에 대한 경고를 활성화하여 처음부터 '깨끗한'이라는 것은 나쁜 생각이 아닐 수도 있습니다. 그러나 기존 코드가 발행 한 경고를 다루는 것이 다소 압도적이라고 생각할 것입니다.

-10은 정수 값으로 구문 분석되며 서명되지 않은 int에 int를 할당 할 수 있습니다. 당신이 뭔가 잘못하고 있다는 것을 알기 위해 컴파일러는 정수 (-10)가 음수인지 긍정적인지 확인해야합니다. 유형 검사 이상의 것이므로 성능 문제에 대해 비활성화 된 것 같습니다.

GCC 컴파일러의 경우 추가 할 수 있습니다

gcc -Wconversion ...

그리고 이것은 다음 경고를 생성합니다

warning: converting negative value '-0x0000000000000000a' to 'unsigned int'

g ++ 4.9.2를 사용하고 있으며이 경고가 나타나기 위해 -wsign -conversion을 사용해야합니다.

gcc.gnu.org: 서명 된 정수와 서명되지 않은 정수 간의 전환에 대한 경고는 -wsign -conversion이 명시 적으로 활성화되지 않는 한 C ++에서 기본적으로 비활성화됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top