Chapter4. 데이터 표현방식의 이해

컴퓨터가 데이터를 표현하는 방식

  • 2진수 : 컴퓨터에 기본적으로 저장되어 있는 방식
  • 8진수 : 0으로 시작하면 8진수로 인식, ex)012 = 10
  • 10진수 : 평소에 우리에게 익숙한 수
  • 16진수 : 0x로 시작하면 16진수로 인식, ex)0xA = 10

데이터의 표현위인 Bit와 Byte

  • Bit : 2진수 값 하나, 0
  • Byte : 8개의 Bit를 모은 값, 00000000

정수와 실수의 표현 방식

  • 정수의 표현 방식 : 4Byte(32Bit)를 사용하여 저장함
    1. 부호를 표현하기 위해 가장 왼쪽의 bit를 MSB(Most Significant Bit)로 사용, 나머지 7bit로 크기를 나타냄, 양수는 0, 음수는 1로 표현
    2. 음의 정수를 표현할 때에는 2의 보수법(Not연산 + 1)으로 처리함 ex)00010000(16) 11110000(-16)
  • 실수의 표현방식 : 정수부분, 소수부분을 나누어서 저장, 컴퓨터는 실수를 100% 정확히 표현하지 못함, 근사치일뿐

오차가 존재함(부동 소수점 오차)

비트연산자

  • & : 비트 단위로 AND 연산
  • | : 비트 단위로 OR 연산
  • ^ : 비트 단위로 XOR 연산
  • ~ : 단항 연산자로서 피연산자의 모든 비트를 반전시킨다, MSB도 반전되어 부호마저 바뀜(NOT 연산, 보수연산)
  • << : 피연산자의 비트열을 왼쪽으로 이동시킴 ex)num<<2 = 두번이동 / 1칸씩 이동할때마다 2배가 됨, 4Byte가 넘는 비트들은 버려진다, 곱셈, 나눗셈보다 성능이 좋음
  • >> : 피연산자의 비트열을 오른쪽으로 이동시킴 ex)num>>2 / MSB의 자리가 0,1로 채워지게 되는데 이떄 CPU에 따라 채워넣는 수가 달라진다, (보통 부호를 유지하여 /2가 됨)

Chapter5, 상수와 기본 자료형

자료형이란? 데이터를 표현하는 방법!

기본 자료형의 종류와 데이터 표현 범위

자료형 크기 값의 표현 범위
정수형 char 1Byte -128이상 +127이하
short 2Byte -32,768이상, +32767이하
int 4Byte -2^32이상, +2^32-1이하
long 4Byte -2^32이상, +2^32-1이하
long long 8Byte -2^64이상, +2^64-1이하
실수형 float 4Byte +-3.4*10^-37이상, +-3.4*10^+38이하
double 8Byte +-1.7*10^-307이상, +-1.7*10^+308이하
long double 8Byte 이상 double 이상

sizeof연산자 : 자료형의 크기를 반환해주는 연산자, 연산결과로 반환되는 값의 크기도 표현 가능

ex) num=sizeof(int), num=4, num=sizeof(char), num=1

 

정수를 표현 및 처리하기 위한 일반적인 자료형의 선택

  • char, short형 연산은 int로 형변환 하여 진행함(컴퓨터의 효율, 연산속도 상승) But 중요도가 연산속도 < 데이터크기 인 데이터를 저장할 때에는 char, short 자료형이 더 유리함

실수를 표현 및 처리하기 위한 일반적인 자료형의 선택

  • 실수 자료형 선택에 있어서 가장 중요한 요소는 '정밀도'
    1. float 형의 소수점 이하 정밀도 : 6자리(까지 요차 발생X)
    2. double 형의 소수점 이하 정밀도 : 15자리 (정수의 int 형처럼 보편적으로 사용 되긴 함)
    3. long double 형의 소수점 이하 정밀도 : 18자리

unsigned 를 붙여 0과 양의 정수만 표현

  • 정수 자료형의 이름에 한해서 unsigned 선언을 추가하면 MSB도 데이터 크기를 표현하는데 사용됨, 따라서 0이상 값의 2배를 표현할 수 있게 된다
  • ex) char의 범위 = -128이상 +127이하, unsigned char의 범위 = 0이상 255(128+127)이하

문자의 표현방식과 문자를 위한 자료형

  • 문자의 표현을 위한 약속 아스키 코드(ASCII Code) = 숫자를 문자에 연결(mapping)하는 방식을 사용함 따라서 저장될 때에는 정수형태로 저장됨
  • char 자료형에 저장됨(문자형으로 불리지만 저장은 정수 형태로 저장된다) 
    • ex) char ch1 = 'A', printf("%d", ch1); 작성시 65 출력 

상수에 대한 이해

  • 상수란? 변경이 불가능한 데이터, 크게 이름이 있는 상수, 이름이 없는 상수로 나뉨
    1. 이름을 지니지 않는 리터럴(Literal) 상수 : 메모리 공간에 할당 되지만 변수와 달리 이름이 없음 ex)num = 10 + 11 에서 10과 11은 리터럴 상수 이다.
      • 이때 연산을 위해 메모리 공간에 상수 형태로 저장됨 이때 메모리에 저장되는 리터럴 상수도 자료형을 가지게 된다! 정수형은 int로, 실수형은 double의 형태로 저장된다.
      • 접미사를 이용해 상수의 자료형을 변경할 수 있다, ex) float num = 5.789 일 경우, 5.789는 double 형으로 저장된 상태이다. 이때 float형 변수에 저장할 경우 4byte가 잘려나갈 수 있다. 이때 5.789f를 사용하여 상수를 float형으로 저장해 주면 된다. 
        접미사 자료형
        U unsigned int unsigned int n = 1025U
        L long long = 2467L
        UL unsigned long unsigned long n = 5567UL
        LL long long long long n = 2456LL
        ULL unsigned long long unsigned long long n = 4234ULL
        F float float f = 3.234F
        L long double long double f = 5.234
    2. 이름을 지니는 심볼릭(Symbolic)상수 : const 상수
      • 변수 선언시 const 키워드를 사용해 주며 된다. ex) const int MAX = 100;
      • 이때 꼭 선언과 동시에 초기화를 해 주어야 한다!!

자료형의 변환

  • 자료형의 변환이란? 자료형으로 표현된 데이터를 다른 자료형으로 바꾸는것 자동(묵시적)과 강제(명시적)이 있다
  • 자동 형 변환(묵시적 형 변환)
    1. 대입 연상의 전달과정에서 발생하는 자동 형 변환
      • 변수에 들어갈 피 연산자의 자료형이 변수의 자료형과 맞지 않을 경우 발생
      • 실수형->정수형 : 실수부분 삭제
      • 데이터의 표현 범위가 넓은 자료형으로의 변환은 손실 발생X
      • 데이터의 표현 볌위가 좁은 자료형으로의 변환은 손실 발생O 이때 상위 비트가 삭제되므로 부호가 변경될 수도 있음
    2. 정수의 승격(Integral Promotion)에 의한 자동 형 변환
      • 앞에 설명했듯이 short형이나 char등의 정수형은 연산시 int 형으로 변환하여 연산됨! 
      • int보다 좁은 범위의 정수형 자료형은 int로 변환된 뒤에 연산됨(넓은 자료형은 손실때문에 사용X)
    3. 피연산자의 자료형 불일치로 발생하는 자동 형 변환
      • 사칙연산과 같은 기본적인 산술시에 두 자료형이 일치하지 않을때 사용
      • ex) double num = 2.15 + 19; 19는 int형 이므로 double형으로 변환함
      • 이때 데이터 손실을 최소화하는 방향으로 진행되므로 형 변환 규칙이 존재함
      • int -> long -> long long -> float -> double -> long double (short, char은 산술시 사용X)
  • 강제 형 변환(명시적 형 변환)
    • 형 변환 연산자(type casting operaor)를 사용하여 변환한다 ex) int a = 4, double b = (double)a;

 

'IT공부 > 윤성우 열혈 C프로그래밍' 카테고리의 다른 글

포인터와 배열의 시작_2  (0) 2022.02.04
포인터와 배열의 시작_1  (0) 2022.02.02
C언어의 기본_4  (0) 2022.01.29
C언어의 기본_3  (0) 2022.01.26
C언어의 기본_1  (0) 2022.01.23

+ Recent posts