2016-12-03 5 views
0

꽤 많은 유사한 질문이 요청을받은,하지만 여전히 저를 당황하게하는 방법서명되지 않은 -1 = 서명 -1

unsigned int a = -1; 
int b = ~0; 
if (a == b) 
    printf("%u\t%d", a, b); 

반환

4294967295 -1

이해 값이 C로 저장되는 이유와 그 숫자가 표시되는 이유는 무엇입니까? a==btrue을 반환하는 이유는 무엇입니까?

+2

C 태그를 사용하고있는 것으로 보아서 추가했습니다. –

+0

위의 링크의 질문과 다른 점은 부호없는 변수가 음수 값인 '-1'로 초기화된다는 것입니다. 여기에 대한 질문은 비교에 관한 것입니다 – Paulo

답변

3

부호있는 부호없는 혼합 비교의 규칙에 따라 a == ba == (unsigned) b과 동일합니다. 즉, 비교는 부호없는 유형의 도메인에서 수행됩니다.

~0의 결과는 모두 1의 비트 패턴입니다. 부호있는 정수 유형에서이 패턴은 2의 보수 플 '폼에 -1을 나타냄니다. 즉, b을 으로 확인한 -1으로 초기화했음을 의미합니다.

따라서 귀하의 비교는 실제로 (unsigned) -1 == (unsigned) -1입니다. 그것이 사실이라면 당연하지.

그러나 2의 보수 표현의 속성에 따라 다르므로 동일성은 여전히 ​​구현에 따라 다릅니다. C 언어가 공식적으로 다른 부호있는 정수 표현 (부호 및 크기, 1의 보수)을 공식적으로 지원하는 한 평등은 그에 따라 달라집니다.

+0

비교가 서명되지 않은 유형의 도메인에서 수행된다고 말하면 비교가 조금씩 이루어집니다. 실제로 16 진수 a는 2s 보수 표현에서 -1 = (-2^31 + 2^31-1) = (0xFFFFFFFF) 인 수학적으로 0xFFFFFFFF (32 비트 플랫폼)와 같습니다. 그리고 b = ~ 0은 모든 비트를 1로 설정하여 16 진수 b = 0xFFFFFFFF를 제공합니다. 그것은 if 조건이 true를 반환하는 것을 설명합니다. – shamba

+0

@shamba : 절대 그렇지 않습니다! 정반대의 C 언어는 "비트 단위"가 아니라 C 언어의 규칙에 따라 비교합니다. 이 경우에는 서명 된 '~ 0'이 '-1'을 생성하는 2의 보수 시스템을 사용하기 때문에 운이 좋았습니다. 1 '의 보수 기계에서'~ 0'은'-1' ('0xFFFFFFFF'는 "음수의 0"이됩니다)을 생성하지 않을 것이며, 기본 원시 표현이 여전히 "bit by bit"와 일치 할지라도 평등은 유지되지 않을 것입니다 . – AnT

+0

@AnT 자료를 참조 할 수 있습니까? 이 비교는'(unsigned) -1 == (unsigned) -1'과 동일하다. 나는 b가 -1이 된 방법을 이미 알고 있지만, 비교를 이해하고 있는가? – Paulo