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

카테고리

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

 

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

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 동화다아아

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함