언어 자료구조 알고리즘/C언어 예제

singed 와 unsigned

언제나휴일 2009. 8. 19. 05:47
반응형

먼저 78과 같은 표현의 타입은 signed 타입으로 취급합니다.

78U 와 같은 표현은 해당 표현의 타입이 unsigned 타입임을 나타내는 표현이고

(unsigned)-1 과 같은 표현은 -1(기본은 signed 타입임)을 unsigned 형으로 형변환함을 의미합니다.

 

참고로 정수형의 singed타입은  int혹은 signed int이며

unsigned타입은 unsigned 혹은 unsigned int 입니다.

 

(int)2147483648U 이와 같은 표현은

2147483648에 해당하는 unsigned 형을 int형으로 강제 형변환을 하는 것을 의미합니다.

 

비교 연산에 있어 signed 와 unsigned 형의 비교는 

signde형을 묵시적으로 unsigned형으로 변환한 후에 비교를 하게 됩니다.

예를 들어,

2147483647U < -2147483647-1 의 경우

우항에 있는 -2147483647-1 의 연산 결과인  -2147483647을 unsigned 형으로 형변환하게 됩니다.

 

signed와 unsigned간의 형변환에서 메모리에 표현된 내용은 바뀌지는 않으며 해석의 차이입니다.

가령 32비트에 11111111 11111111 11111111 11111111 와 같이 저장되어 있을 때

unsigned 형의 경우는 4294967295로 해석하지만

int형의 경우는 -1로 해석을 합니다.

 

다음은 C언어에서 모두 참인 명제이다.  왜 참인 명제인지 밝히시오.

 

0 == 0U

-1 > 0U

2147483647 > -2147483647-1

2147483647U < -2147483647-1

2147483647 > (int)2147483648U

(unsigned) -1 > -2

(unsigned)  -2147483647-1 < -2147483647

(unsigned) -2147483647-1 > 2147483647


주석으로 각 비교해야 할 값을 어떠한 값으로 해석하는 지에 대해 마크해 놓았습니다.
분석해 보시기 바랍니다. 이제 남은 것은 여러분의 몫입니다.  휘리릭~~~
 #include <stdio.h>

void main()
{
    if(0 == 0U) // 0 == 0U는 자명하다.
    {
         printf("1\n");
    }
    else
    {
         printf("NO1\n");
    }

 
    if(-1 > 0U)    // -1을 unsigned로 변환할 경우값은 429497295이다.
    {
         //printf("%u\n",-1); //이를 통해 확인할 수 있다.
         printf("2\n");
    }
    else
    {
         printf("NO2\n");
    }
 
    if(2147483647 > -2147483647-1)  //2147483647>-2147483688 은 자명하다.
    {
         printf("3\n");
    }
    else
    {
         printf("NO3\n"); 
    }
 
    if(2147483647U < -2147483647-1) //(-2147483647-1)에 대한 unsigned 값은 2147483648이다.
    {
         //printf("%u\n",-2147483647-1); //로 u값을 확인해 보면 알 수 있다.
         printf("4\n");
    }
    else
    {
         printf("NO4\n");
    }
    if(2147483647 > (int)2147483648U) //(int)2147483648U 은 -21474836485이다.
    {
         //printf("%d",(int)2147483648U);  //이를 통해 확인할 수 있다.
         printf("5\n");
    }
    else
    {
         printf("NO5\n");
    }
    if((unsigned) -1 > -2) // (unsigned) -1 는 4294967295 이며 (unsigned) -2는 4294967294이다.
    {
         //printf("%u   %u \n",-1,-2);  //이를 통해 알 수 있다.
         printf("6\n");
    }
    else
    {
         printf("NO6\n");
    }

 
    if((unsigned)  -2147483647-1 < -2147483647) //2147483648과 2147483649이다.
    {
         //printf("%u %u \n",-2147483647-1 , -2147483647); //이를 통해 확인 가능
         printf("7\n");
    } 
    else
    {
         printf("NO7\n");
    }
    if((unsigned) -2147483647-1 > 2147483647)//2147483648과 2147483647 이다.
    {
         //printf("%u %u\n",-2147483647-1  ,2147483647); //이를 통해 확인 가능
        printf("8\n");
    }
    else
    {
         printf("NO8\n");
    }
}

반응형

'언어 자료구조 알고리즘 > C언어 예제' 카테고리의 다른 글

[C언어 소스] 정사각형 출력 - 반복문 연습  (0) 2016.04.03
파서트리  (0) 2009.08.19
큰 수의 덧셈, 곱셈  (0) 2009.08.19
적분 공식을 이용하여 파이 구하기  (0) 2009.08.19
Visual C++ 표준 라이브러리 헤더파일  (0) 2009.08.19
16진수와 2진수 사이의 변환  (0) 2009.08.19
파서트리  (0) 2009.08.19
new 연산자 오버로딩  (0) 2009.08.19
퀵소트  (0) 2009.08.19
선택정렬  (0) 2009.08.19