혼자 공부하는 c 언어

혼자공부하는 C언어 상수와 데이터 표현법

미미_밍 2023. 7. 14. 23:22

2-2 상수와 데이터 표현방법

-c 언어는 메모리에 직접 접근, 비트단위 연산 가능 -> 데이터가 메모리에 저장되는 방식 알아야 활용가능 

 

데이터 = 프로그램이 처리하는 대상 

데이터 형태 = 변수, 상수 

상수 = 값이 정해져 있고 변하면 안됨(정수, 실수 , 문자 , 문자열  )

 

정수상수

= 0~9 +- 로 표현 10진수,8진수,16진수로 표현 가능

*진법은 수를 표현하는 방법이다. 

7까지는 다 같음, 표기상 8진수는 숫자앞 0 16진수는 0x를 붙여서 표기한다.

#include <stdio.h>

int main(void)
{
    printf("%d\n",12);
    printf("%d\n",014);
    printf("%d\n",0xc);

    return 0;
}

*진법에 따라 다르게 표기한 것일 뿐 모두 같은 값임

#include <stdio.h>

int main(void)
{
    printf("%o\n",12);
    printf("%x\n",12);
    printf("%X\n",12);

    return 0;
}

10진수를 8진수나 16진수로도 출력할 수 있다. 

8진수는 o, 16진수는 x , 대문자 출력은 X를 앞에 써주어 바꿀 수 있다. 

 

실수 상수 

실수 = 소수점 형태 or 지수형태로 표현 가능

*소수점 앞 0을 유효숫자 한자리를 사용해 지수형태로 바꾼것을 정규화 표기법이라 함 

ex)0.0000312 -> 312e-7(e-7 = 10의 -7승)

 

printf 함수가 실수를 지수형태로 출력할때는 정규화 표기법을 사용 

 

#include <stdio.h>

int main(void)
{
  printf("%.1lf\n",1e6);
  printf("%.7lf\n",3.14e-5);
  printf("%le\n",0.0000314);
  printf("%.2le\n",0.0000314);

  return 0;
}

printf 함수는 정규화 표기법을 이용하여 출력해도 기본적으로 소수점으로 출력함

이때 쓸수 있는게 "le" 

 

*le 를 사용하면 정규화 표기법으로 출력된다. 

*1행은 1000000.0 을 지수 형태로 표현한 것 

*lf 로 출력하면 소수점 이하 6자리 까지 출력됨으로  7째 자리까지 출력하려면 .7lf 로 늘려주어 유효숫자가 잘리지 않도록  함

*소수점 위치 표현 0 제외한 모든 수가 유효숫자다. 

*소수점 이하 자릿수 지정은 마찬가지로 .2le 

 

문자와 문자열 상수 표현법 

-문자는 작은 따옴표 ' ' 로 묶고 문자열은 큰따옴표 ""로 묶는다. 

#include <stdio.h>

int main(void)
{
    printf("%c\n",'A');
    printf("%s\n","A");
    printf("%c은 %s입니다.\n", '1',"first");
    
    return 0; 
}

*"A"는 하나의 문자라도 "" 로 묶여있으니 문자열로 취급한다. 

*문자는 %c변환문자를 , 문자열은 변환문자 없이도 출력할 수 있으나 보통%s 로 출력한다. 

 

상수가 컴파일 된 후의 비트 형태 

 

위의 정수,실수,문자,문자열 상수들은 코드를 입력하면 컴퓨터가 이해하는 아스키코드 값으로 저장된다.

*아스키 코드는 사람이 사용하는 기호를 컴퓨터 안에서 표현하는 방법 

ex) A 입력 -> 01000001 로 저장

       01000001 발견->A 띄워줌 

 

컴파일러를 거쳐야 연산자가 명령어가 되고 상수는 연산 가능 형태로 바뀐다. 그전에는 그냥 하나의 문자일 뿐 

*8비트 = 1바이트 

 

정수상수 컴파일 = 4바이트로 표현 

실수상수 컴파일 = 8바이트로 표현

문자상수 컴파일 = 2진수형태의 아스키코드로 번역 ex) A = 65 정수 65와 같은 형태로 번역됨

 

*정수는 가장 빠르고 정확하게 연산됨 so 왠만하면 정수 사용

*결국 문자 상수는 정수와 같은 방식으로 처리됨 

*상수의 크기는 일정하지 않다. c++에선 문자상수도 1바이트 처리 

 

정수 상수가 컴파일된 후의 비트 형태 

정수는 양수 음수로 나뉨 음수데이터 표현방식이 독특하다. 

 

양수변환 = 13은 2진수로 1101 정수는 4바이트 임으로 00000000 00000000 00000000 00001101 로 나머지 0으로 채움

*1비트가 왼쪽에 위치할수록 커짐. 

 

정수의 표현범위 = 8비트 0~255 , 255 보다 큰 수 사용시 컴파일러가 데이터크기 4바이트로 늘려 처리 
*13LL 처럼 뒤에 LL 붙이면 자동으로 데이터 크기 8바이트 처리됨

 

음수변환

음수는 절댓값을 2의 보수로 바꾸어 처리2의 보수 = 2진수 0과 1을 바꾼상태에서 1을 더한값 

 

실수 상수가 컴파일된 후의 비트 형태

 

실수의 경우 제한된 데이터 크기의 수 표현 (아니면 너무 커진다, 비효율적)

실수 데이터크기의 여러 방식이 있지만 가장 많이 쓰는건 double 

double = 8바이트를 사용하며 부호비트, 지수부, 소수부로 구성

 

부호비트 = 가장 왼쪽 비트, 0양수, 1음수 

지수부 = 부호비트 다음 11비트 

소수부 = 나머지 52비트 

 

*실수상수의 오차 = 소수부분 나타내는 비트는 정확한 값 표현 불가. 결론적으로 실수데이터 표현방식에 정해져있는 유효숫자 까지의 숫자만 쓰는게 좋다. ex) double 형의 경유 15자리까지 유효숫자 사용 가능