블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday

     

    출력 값을 비교 전에 우선 간단히 이론을 정리해 보면,

    signed char - 정수 값으로 출력되며 생략해도 상관없다. (-128~127)

    unsigned char - 양수 값으로 출력된다. (0~255)

    unsigned int 는 0 ~ 4,294,967,295

    char - 1 byte 로 표시

    short - 2 byte 로 표시

    int - 4 byte로 표시



    #include<stdio.h>

    int main()

    {

            unsigned char cNum; //1byte char형 양수 cNum이란 이름 선언

            unsigned short sNum; //2byte short형 양수 sNum이란 이름 선언

            unsigned int iNum; //4byte int형 양수 iNum이란 이름 선언


            //char cNum;

            //short sNum;

            //int iNum;


            cNum = -1;

            sNum = -1;

            iNum = -1;


            printf("cNum:[%d], sNum[%d], iNum[%d]\n", cNum, sNum, iNum);

            sNum = cNum;

            printf("cNum:[%d], sNum[%d], iNum[%d]\n", cNum, sNum, iNum);


            return 0;

    }


    출력 값.



    이 나타난다.



    #include<stdio.h>

    int main()

    {

            //unsigned char cNum; // 1byte char형 양수 cNum이란 이름 선언

            //unsigned short sNum; // 2byte short형 양수 sNum이란 이름 선언

            //unsigned int iNum; // 4byte int형 양수 iNum이란 이름 선언


            char cNum;

            short sNum;

            int iNum;

    로 변수를 선언하고 출력했을 때의 결과 값은



    이 나타난다.


    unsigned와 signed 출력 값 비교

     

     


    두 결과 값의 경우 공통적으로 int 변수로 지정된 iNum의 경우 -1로 표시된 것은 %d값으로 입력되어 표현되었을 때는 그 결과 값이 너무 길어서 출력이 -1로 표시 된 것이 아닌가라고 생각된다.


    본론으로 들어가서 sNum=cNum을 대입한 경우 이 값이 -1이 나온 것에 대해 생각해 보자.


    char의 값 -1의 경우는 unsigned에서 255의 값으로 출력되었으며 이것은 우리가 알고 있는 사실과 동일하다. unsigned는 수를 양수로만 표현해 주며 따라서 0부터 255까지의 값을 가지는 char 1byte 정수형의 경우에 -1의 값은 255와 같다.


    그런데 왜 signed 형에는 같은 -1을 대입했는데 결과 값이 다른 것일까?


    나름대로 여러 가지 조사와 궁리해 본 바로는 그 이유가 부호 확장에 있는 것 같다.


    short sNum = char cNum 에서 cNum은 char 형이기 때문에, 묵시적인 형 변환이 발생하게 되는데 이때, char형 데이터인 cNum을 바로 short형 데이터 sNum에 넣는 것이 아니라 cNum을 2바이트 크기로 확장을 하게 된다.


    1바이트에서 2바이트로 확장을 하면서 나머지 빈 공간에는 음수면 1로 채우고 양수면 0으로 채우게 된다.


    따라서 (signed) char 인 a변수는 앞에 1을 채워서 1111 1111 1111 1111가 되고, unsigned char 인 cNum 변수는 앞에 0을 채워서 0000 0000 1111 1111가 되는 것이다.


    그렇다면 부호 확장은 무엇일까? 부호 확장이란 데이터의 비트 크기를 확장하는 것이다.
    위의 경우처럼, 8비트를 16비트로 만드는 것을 말할 수 있겠다.

    양수 값의 부호 확장에는 상위 자리 0으로 채우고,
    음수 값의 부호 확장에는 상위 자리를 1로 채우게 된다.

     

    즉, 부호 확장으로 1바이트의 char 변수 값 -1이 2바이트의 short 변수 값에 대입 되면서 앞쪽에 1바이트의 빈 공간이 생기게 되고 signed와 같은 경우는 부호비트를 가지므로 부호에 따라 음의 값(1)의 최상위 비트를 가졌던 cNum = -1은 sNum에 대입되면서 앞쪽의 1바이트 공간에 1을 채우게 되어 1111 1111 1111 1111 의 값을 가지므로 -1이 표시되게 된다.


    물론 unsigned의 경우에는 부호비트가 존재하지 않기 때문에(unsigned는 양수로만 표현되게 한다.) 부호 확장이 생기지 않으므로 더 큰 바이트를 가지는 변수에 대입하더라도 그대로 표시된다.

    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함