201303/실수형. 형식지정자 %u.

2013. 4. 3. 16:40프로그래밍/C언어 TIP

 실수형

실수형은 소수점이 있는 수를 말한다. 정수도 실수에 포함된다. 기본적으로 정수는 CPU에 보수방식으로 저장되지만 실수는 조금 다르면서 복잡하게 저장된다. 지금부터 CPU에 어떻게 저장되는지 알아본다. 실수형의 저장방법은 IEEE 754표준으로 실행된다

13.257이라는 실수를 가지고 저장방법을 알아본다. 제일 먼저13과0.257을 분리해서0.257을2진수로 표현하면, 0.257 = 0100 0001 1100(2진수)가 나오게 됩니다. 거기서 13을2진수로 표현하면,13 = 1101이 나오게 됩니다.

둘을 합치면,

1101.010000011100이 만들어 지게 됩니다. 이 수를 IEEE754로 표준규격에 따라 정리해나갑니다. 4byte의 경우 부호비트가1비트 지수가8비트 가수가 나머지 23비트입니다. 총4바이트입니다. 먼저 부호는 전체 값(13.257)이 양수이므로, 0이 들어가게 됩니다. 이진수 값을1.xxx * 2^n형식으로 정규화를 해보겠습니다. 좌로3번 이동하게 되면 1.101010000011100 × 23 승이 만들어 집니다.

위에 앞에1을 제외하고 나머지 값을 가수(mantissa)라고 하고 23비트 가수부안에 저장되게 되는 겁니다. 그리고 지수(승수3)에 바이어스값 127을 더해줍니다. 지수에 바이어스값을 더하는 이유는 음의 지수값을 양수로 표현하고자 하는 것입니다. 물론 음수 승이 였다면 127보다 작은 값, 양수승이면 127보다 큰 값을 가지게 됩니다. 3 + 127은130, 다시 130를2진수로 바꾸면 1000 0010이 됩니다. 이 값을 지수부분에 넣어줍니다. 

실수 13.257은 다음과 같이 저장되게 됩니다. 
(0) (10000010) (101010001110000000000)
 부호    지수부             가수부



◈ 형식지정자 %u (unsigned int)

다음과 같은 소스를 출력하게 되면,

#include <stdio.h>

int main()

{

unsigned int iNum = -1;

printf("%d\n",iNum);

printf("%u\n",INum);

 

return 0;

}

결과

위와 같은 답이 나오게 된다. unsigned int형으로 -1을 출력하게 되면 대략 42억정도의 수가 나와야 하지만 -1이 출력됐다. 그 이유는 %d는 signed int형 출력하는 부호가 있는 10진수 형식지정자이기 때문이다. 그렇기 때문에 %u라는 unsigned int형의 값을 나타내주는 형식지정자를 사용하여 원하는 값을 출력하게 되는 것이다.

다음과 같은 소스를 출력해서 부호확장과 제로확장에 대해 알아본다.

#include <stdio.h>

int main()

{

    unsigned int A = -1;

    unsigned char B = -1;

    char C = -1;

    

    printf("%d\n",A);

    printf("%u\n",A);

 

    printf("%d\n",B);

    printf("%u\n",B);

 

    printf("%d\n",C);

    printf("%u\n",C);

 

    return 0;

}

결과

위와 같은 출력이 나온다. unsigned int는 4byte크기의 레지스터에 따라 %d와 %u 형식지정자를 이용하여 정상출력 되었다.unsigned char의 경우도 4byte레지스터로 확장되면서 unsigned char 변수에 의해 제로확장이 발생하여 나머지 비트가 0으로 채워지고 %d %u 모두255로 출력되었다. 하지만char의 경우 unsigned int로 -1을 출력했을 때와 같은 답이 나오게 된다. 그것은 1byte의 char가 레지스터로 확장되지만 signed char가 확장되면서 제로확장이 아닌 부호확장이 발생하게 된다. 남은 비트가 모두 1로 채워지면서 4byte의 최대값이 출력되게 된다.