서명 된 값이 서명되지 않은 정수에 할당 될 때 컴파일러가 오류를 제공하지 않는 이유는 무엇입니까? -C ++
-
12-09-2019 - |
문제
알아요 서명되지 않은 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 ++에서 기본적으로 비활성화됩니다.