2014-11-16 3 views
4

예를 들어 if (-1> 2)라고 할 때. 부호가있는 값 (-1)이 부호가없는 값으로 변환되기 때문에이 조건은 참입니다. 그러나 내가 알고 싶은 것은 그것을 어떻게 개조 하는가? 가치가 바뀌면 무엇이 될 것입니까?부호있는 번호와 부호없는 번호 비교

+0

기계에 따라 다르지만 거의 모든 현대적인 것들은 [2의 보수]를 사용합니다. (http://en.wikipedia.org/wiki/Two's_complement) – Kevin

+5

컴파일러가 -1> 2라고하면 – amdn

+0

@ Kevin Ok. 2의 보수로 (11111111) 인 (-1)을 변환하면 (1) 10 진수의 (00000001)이됩니다. 그러면 조건은 (1> 2)가되며 거짓이어야합니다. 그러나 프로그램에서이를 시도 할 때 그것이 사실임을 보여줍니다. 왜? – user3417785

답변

4

예를 들어 (-1> 2)라고 할 때. 부호있는 값 (-1)이 부호없는 값으로 변환 되었기 때문에이 조건이 적용됩니다.

아니요.

모두 정수 상수, 타입 int (즉 signed int)가 (피연산자의 부호를 변경하는, 이전의 피연산자로 단항 연산자를 작용이 맥락에서 -로, 상수 표현식입니다 @ KeithThompson의 의견에서 지적했듯이, 정확합니다) 따라서 @amdn은 변환 할 것이 없다는 것을 지적 했으므로 (피연산자 유형은 단순히 동일하므로) if의 결과는 0 (또는 false)입니다.

아마 당신은 다른 이야기의 종류 인 -1 > 2U을 의미했을 것입니다. 보통 산술 변환 규칙 (대괄호로 정수 프로모션이라고 함) 때문에 int의 피연산자는 (또는 단순히 수학적 의미에서 2)보다 클 수있는 큰 숫자를 산출하여 unsigned 유형으로 승격됩니다. 더 구체적으로는 unsignedint 유형 모두 동일한 순위이지만 이러한 조건으로 인해 서명 된 대응 항목 (즉, 피연산자)은 서명되지 않은 상태로 승격됩니다.

+0

@mafso : 귀중한 의견에 감사드립니다! –

+1

예, 정수 상수 '1'과 '2'는 모두 'int'유형입니다. 그러나'-1'은 정수 상수가 아닙니다; 단항'-' 연산자가 적용된 상수'1'과'int' 유형의 상수 표현식입니다. –

관련 문제