programing

음의 int가 부호 없는 int보다 큰 이유는 무엇입니까?

padding 2023. 6. 17. 08:45
반응형

음의 int가 부호 없는 int보다 큰 이유는 무엇입니까?

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

저는 서명이 안 된 것이기 때문에 출력이 더 클 것으로 생각했습니다.이것의 배경은 무엇입니까?

왜냐하면.int값이 다음 값으로 승격됨unsigned int구체적으로0xFFFFFFFC32비트 시스템에서, 즉unsigned int이라4294967292보다 상당히 큰.10

C996.3.1.1-p2

int가 비트 필드의 너비에 의해 제한된 원래 유형의 모든 값을 나타낼 수 있으면 값이 int로 변환되고, 그렇지 않으면 부호 없는 int로 변환됩니다.이것들을 정수 프로모션이라고 합니다.다른 모든 유형은 정수 프로모션에 의해 변경되지 않습니다.

변환을 수행하는 방법

C99 6.3.1.3-p2

그렇지 않으면 새 유형이 서명되지 않은 경우 값이 새 유형의 범위에 포함될 때까지 새 유형에 표시될 수 있는 최대값보다 하나 더 추가하거나 빼는 작업을 반복하여 값을 변환합니다.

즉, 기본적으로 "UINT_MAX+1 추가"를 의미합니다.

프로모션이 왜 다음과 같았는지에 대해 설명합니다.unsigned int측면; 우선 순위:

C99 6.3.1.8-p1

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

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

그 말은int대.unsigned 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

자, 이것 좀 보세요.

서명된 값과 서명되지 않은 값을 비교하는 작업은 "서명되지 않은 공간"에서 수행됩니다.즉, 다음을 추가하여 서명된 값이 서명되지 않은 값으로 변환됩니다.UINT_MAX + 1음의 값에 대해 2-보수를 사용하는 구현에서는 후드 아래에서 값을 특별하게 처리할 필요가 없습니다.

이 예에서,-4로 바뀌었습니다.0x100000000-4=0xFFFFFFFC분명한 것은> 10.

C에서 두 값을 비교할 때 두 값은 모두 같은 유형이어야 합니다.이 경우 (int그리고.unsigned intint는 값다음변니됩다환로으로 됩니다.unsigned int

없는 + 1 "around" "loop around" 즉, "loop around", C 부 호 의 즉 정 로 연 산 + 1행 "loop around")로 수행됩니다.UINT_MAX + 1이라0다시 또는 그 반대).따라서 음수 값을 부호 없는 값으로 변환하면 숫자가 매우 커집니다.

표준의 관련 섹션에는 다음과 같이 나와 있습니다.

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

2
그렇지 않으면 새 유형이 서명되지 않은 경우 값이 새 유형의 범위에 포함될 때까지 새 유형에 표시될 수 있는 최대값보다 하나 더 추가하거나 빼는 작업을 반복하여 값을 변환합니다.

를 할 때int 리고그.unsigned int그자리의 int는 로변됩니다로 됩니다.unsigned intint완전히unsigned int는 추면됩니다하가를됩▁adding를 추가하여 수행됩니다.UINT_MAX+1로 (으)는int음). 있는 은 다음과 같습니다.따라서 실제로 비교하는 것은 다음과 같습니다.

if (-3 + UINT_MAX > 10)  //Since -4 is converted to UINT_MAX+1-4

그건 사실입니다.

int 값의 첫 번째 비트는 양수인지 음수인지 정의하는 데 사용됩니다. (1 = 음수, 0 양수) 두 변수는 비교 전에 부호 없는 int에 캐스팅됩니다. 여기서 첫 번째 비트의 1은 숫자의 일부로 해석됩니다.

이 코드는 잘 작동할 것입니다.

int main(void) 

 { 

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

 } 

int x=-4 (2의 보어 4는 11111100 = 252)이고 부호 없는 inty=10은 (0000 1010 = 10)이므로 252 > 10 so -4는 10보다 큽니다.

언급URL : https://stackoverflow.com/questions/13600991/why-is-a-negative-int-greater-than-unsigned-int

반응형