확인 - c언어 포인터 형변환




부정 int가 부호 없음 int보다 큰 이유는 무엇입니까? (4)

이 질문에는 이미 답변이 있습니다.

int main(void) 
{ 
     unsigned int y = 10; 
     int x = – 4; 
     if (x > y) 
        Printf("x is greater");
     else 
        Printf("y is greater"); 
     getch(); 
     return (0); 
} 

Output: x is greater

나는 출력이 y가 될 것이라고 생각했다. 이것의 원인은 무엇입니까?


C에서 두 값을 비교할 때 둘 다 같은 유형이어야합니다. 이 경우 ( intunsigned int ) int 값은 unsigned int 먼저 변환됩니다.

둘째, C에서 부호없는 정수 연산은 해당 유형의 최대 값을 +1하여 수행됩니다. 즉, UINT_MAX + 1 이 다시 0 이되도록 UINT_MAX + 1 루프가 돌아 UINT_MAX + 1 반대의 경우도 마찬가지입니다). 따라서 음의 값을 부호없는 결과로 변환하는 것은 매우 큰 수입니다.

표준의 관련 섹션은 다음과 같이 말합니다 :

6.3.1.3 부호있는 및 부호없는 정수

2
그렇지 않으면 새 유형이 부호가없는 경우 값이 새 유형의 | 위 내에있을 때까지 새 유형에서 표시 할 수있는 최대 값을 하나씩 더] 복적으로 더하거나 빼서 값을 변환합니다.


int x = -4 (4의 2의 보수는 1111 1100 = 252 임) 및 부호없는 int y = 10은 (0000 1010 = 10)이므로 252> 10이므로 -4가 10보다 큽니다.


signed와 unsigned 값의 비교는 "unsigned space"에서 이루어진다. 즉, 부호있는 값은 UINT_MAX + 1 을 추가하여 부호없는 값으로 변환됩니다. 음수 값에 대해 2 보수를 사용하여 구현할 때 후드에서는 값을 특별히 처리하지 않아도됩니다.

이 예에서 -40x100000000-4 = 0xFFFFFFFC 로 명확하게 > 10 입니다.


int 값이 unsigned int 승격 되었기 때문입니다. 32 비트 시스템에서 특히 0xFFFFFFFC 인데, 이는 unsigned int4294967292 이고 10 보다 상당히 큽니다.

C99 6.3.1.1-p2

int가 원의 형태의 모든 값을 표현할 수있는 경우 (비트 필드의 경우는 폭에 의해 제한됩니다), 값은 int로 변환됩니다. 그렇지 않으면 unsigned int 로 변환됩니다. 이것을 정수 승격이라고합니다. 다른 모든 유형은 정수 승격에 의해 변경되지 않습니다.

변환을 수행하려면 다음을 수행하십시오.

C99 6.3.1.3-p2

그렇지 않으면 새 유형이 부호가없는 경우 값이 새 유형의 | 위 내에있을 때까지 새 유형에서 표시 할 수있는 최대 값을 하나씩 더] 복적으로 더하거나 빼서 값을 변환합니다.

기본적으로 "추가 UINT_MAX + 1"을 의미합니다 (어쨌든 읽었을 때).

프로모션이 unsigned int 측에있는 이유 상위:

C99 6.3.1.8-p1

... 그렇지 않으면 부호없는 정수 유형을 갖는 피연산자가 다른 피연산자 유형의 순위보다 크거나 같은 경우 부호가있는 정수 유형의 피연산자는 부호없는 정수 유형의 피연산자 유형으로 변환됩니다.

그렇지 않으면 부호있는 정수 유형을 갖는 피연산자의 유형이 부호없는 정수 유형의 피연산자 유형의 모든 값을 나타낼 수있는 경우 부호없는 정수 유형의 피연산자는 부호있는 정수 유형의 피연산자 유형으로 변환됩니다.

어느 날 intunsigned char 가 예상대로 작동해야한다고 알려줍니다.

테스트

int main()
{
    int x = -4;
    unsigned int y = 10;
    unsigned char z = 10;

    if (x > y)
        printf("x>y\n");
    else
        printf("x<y\n");

    if (x > z)
        printf("x>z\n");
    else
        printf("x<z\n");
    return 0;
}

산출

x>y
x<z

잘 보아라.





signed