C언어 복습

C언어 복습 14 (자료형)

Captic 2019. 6. 26. 10:06

참고: 정덕 - <컴맹을 위한 C언어>

♨ 개인적 해석이 다분한 글임으로, 인지하지 못한 오류가 있을 수 있습니다 

 

▣ 자료형의 대분류 : 정수형 / 실수형

 

▣ sizeof 연산자

 - 정수형, 실수형의 구분 안에서 크기에 따라 자료형 한번 더 분류

 - 자료형의 크기: 특정 자료형으로 변수를 선언했을 때 변수가 메모리에서 차지하는 공간의 크기

    -> sizeof 연산자를 통해 자료형의 크기 파악 가능

 

예)

int 변수(kar)과 int의 크기는 4바이트로 동일하다

 ※sizeof 연산의 결과값은 size_t 자료형의 데이터

   -> size_t는 C언어 표준에 의해 양의 정수(unsigned int)로 정의 but 크기는 4, 8바이트

       C99 표준에서부터 8바이트 양의 정수를 출력할 수있는 %zu 사용가능(dev에서는 지원X)

       대신 %Id(signed size_t)와 %Iu(unsigned size_t)로 출력할 수 있다

 

VS에서 zu가 가능하기 때문에 이렇게 Iu->zu로 바꿔도 출력이 가능하다

 

정수형

※ long long a =2300000000;

   위의 코드를 실행하면 경고나 에러가 발생

    ->정수를 그냥 쓰면 int형으로 인식 / 23억은 int로 표현 불가

 =>long long형 상수를 쓸때는 접미어LL을 붙여야 한다

∴long long a = 2300000000LL;

 

※ long long 출력 시에 %Id 서식문자 사용해야 한다 unsigned long long의 경우 %Iu를 사용

 

 - 실수형

※컴퓨터 설정에 따라 float, double의 크기가 다를수 있으나 대부분의 컴퓨터가 IEEE의 실수 표준을 따르고 있어 아마 f=4, d=8 일것

*정수형과 실수형의 차이점(long도 4바이트, float도 4바이트인데 무슨차이가 있나?)

 - 비트를 사용하는 방법에서의 차이

    예) char a=4; 일때 컴퓨터가 2진수로 데이터를 저장한다면

 

        0          0000100 

    부호비트    숫자비트들(정식용어X, 편의상)

 

   맨 앞의 비트로 부호를 표현: 0이면 양수, 1이면 음수

 

  이때 4의 부호를 음수로 바뀌면 -4가 되겠구나해서 바꾸면,

        1         0000100

부호비트가 1(음수니까), 숫자부분은 100이니까 10진수로는 4 합치면 -4???

  그러나!! 실제로는 -124의 비트

 

   4+(-4) = 0 임을 이용하여 이것을 증명해보면

   00000100

 +10000100

  --------------

   10001000 ≠ 0

 

  ∴10000100 ≠ -4

 

 => 컴퓨터의 음수 표현법 = 2의 보수법

   1. 전체 비트의 1과 0을 반전시킨다

   2. 1을 더한다

     예) 2진수 4 = 00000100

        반전(1.)->   11111011

          =1(2.)->   11111100 = 10진수 -4

 

다시 한번 4+(-4)=0 을 통해 증명해보면

    00000100

   +11111100

  ---------------

    100000000 -> char는 8비트이기에 9번째 자리는 버려진다

   = 00000000

 

    ∴11111100 = -4

 

2의 보수법으로 표현된 음수는 다시 2의 보수법으로 변환하면 그 절댓값(양수값)을 알 수 있다

 

▣ 양의 정수

 - 양의 정수를 표현하는 자료형 = 정수 자료형 앞에 "unsigned"라는 키워드를 붙여 선언

 

unsigned char v1;

unsigned short v2;

unsigned int v3;

unsigned ling v4;

unsigned long long v5;

unsigned = 부호가 없다(+,-가 없으면 무적권 +)

-> 비트 전체가 숫자를 표현하기에 음수를 표현할 수 없다

-> 맨 앞 자리가 부호비트가 아니기에 더 많은 수를 표현 할 수 있다(실수형은 적용X)

 

▣ 실수형

 - 실수는 부동소수점(M*r^n)으로 표현

   M: 가수

   r: 밑수 = 2로 고정

   n: 지수

 

  1. 4바이트 실수(float)

 -맨 앞의 비트를 부호비트로 사용(정수형과 동일)

 -부호 비트 이후 8비트 = 지수 / 나머지 23비트 = 가수 표현

 

 2. 8바이트 실수(double)

 -형태는 float과 동일

 -부호 이후 23비트 = 지수 / 나머지 52비트 = 가수 표현

 

*정수형이 저장할 수 있는 숫자 범위

 -1비트로 표현할 수 있는 정보 0 , 1 -> 2개

 

 -2비트 1) 양수만 표현 할 경우(unsigned) 00(0), 01(1), 10(2), 11(3) -> 0~3 : 4개

          2) 음수도 표현할 경우 00(0), 01(1), 10(-2), 11(-1) -> -2~1 : 4개

 

 -3비트 1)양수만 000(0), 001(1), 010(2), 011(3), 100(4), 101(5), 110(6), 111(7) -> 0~7 : 8개

          2)음수도 000(0), 001(1), 010(2), 011(3), 100(-4), 101(-3), 110(-2), 111(-1) -> -4~3 : 8개

 

 - 위 자료를 기반으로 일반화를 해본다면

   n개의 비트에 표현할 수 있는 숫자의 개수와 범위

   -> 비트의 개수: n개

       표현 가능한 숫자 개수: 2^n개

       양수만 표현할 경우 숫자 범위: 0~2^(n-1)

       음수만 표현할 경우 숫자 범위: -2^(n-1) ~ 2(n-1)-1

 

 1. char -1바이트 = 8비트 ∴ 2^8(256)개 표현 가능

   1) unsigned: 0~255

   2) signed :-128~127

 

 2. short -2바이트 = 16비트 ∴ 2^16(65,536)개 표현 가능

  1) unsigned: 0~65,535

  2) signed: -32,768~32,767

 

 3. int/long -4바이트 =32비트 ∴ 2^32(4,294,967,296)개 표현 가능

  1) unsigned: 0~ 4,294,967,295

  2) signed: -2,147,483,648~2,147,483,647

 

 4. long long -8바이트 = 64비트 ∴ 2^64(18,446,744,073,709, 551,616)개 표현 가능

  1) unsigned: 0~18,446,744,073,709, 551,615

  2) signed: -9,223,372,036,854,775,808~9,223,372,036,854,775,807

 

※ printf 서식문자

   printf("%a", b);   ->  c

  (서식문자 = a, 대상형태 = b, 결과 = c)