C언어Express CH04 Exercise

2400·2023년 10월 18일

변수와 상수

변수는 저장된 값이 변경될 수 있지만 상수는 값이 변경되지 않는다.

자료형

정수형,부동소수점형(컴퓨터에서는 실수를 부동소수점으로 저장하기에 실수형을 부동소수점형이라고 부른다),문자형

정수형 = short, int, long, long long
부동소수점형 = float, double, long double
문자열 = char

자료형의 크기를 알기위해서는

sizeof()

연산자를 사용하면 된다
이는 변수나 자료형의 크기를 바이트 단위로 반환하는 연산자이다.

정수형

short(16비트)(2바이트) <= int(32비트)(4바이트)long<=(32비트)(4바이트)<=long long(64비트)(8바이트)

unsigned 수식자

unsigned 키워드는 정수형 또는 char형 앞에 올수 있다.
unsigned는 음수가 아닌 값만을 나타낸다는 것을 의미한다.
unsigned 키워드를 붙이면 부호를 나타내는 비트가 필요 없어서 표현할 수 있는 양수 범위가 2배가 된다.

printf() 를 이용하여 unsigned 형 변수를 출력할 경우에는 형식 지정자로 %u를 사용하여야 한다.

unsigned int sales = 2800000000
printf("%u \n",sales);

오버플로우

변수가 저장할 수 있는 범위를 넘어서는 수를 저장했을 경우에 발생한다.

오버플로우 되면 다시 처음으로 돌아가서 계산을 하게된다.
0 > 1 > 65534 > 65535 > 0

정수 상수

정수상수는 기본적으로 int 형으로 간주되지만, int형의 범위를 넘는 정수 상수는 컴파일러가 long형으로 취급하고, 더 큰 수라면 unsigned long형으로 변경될 수 있다.(상수처리할때 가장 낮은 자료형을 선택한다.)

unsigned int / 123u or 123U
long / 123l or 123L
unsigned long / 123ul or 123UL

기호 상수

기호상수: 상수를 기호로 표현한 것

won = 1120 * dollar; // 실제의 값을 사용
won = ENCHANGE_RATE * dollar; // 기호상수 사용
  • 기호상수선언(#define 사용)
#define ENCHANGE_RATE 1120
#define / 기호상수 / 값
전처리기 끝에는 세미콜론을 붙이지 않는다
  • 기호상수선언(const 키워드 사용)
const int ENCHANGE_RATE = 1120;
const int  / 기호상수 / 값
const 를 변수 선언 앞에 붙이면 상수가 된다.

10진수를 2진수로 변환하는 방법
1. 주어진 수를 2로 나누어서 몫과 나머지를 기록한다.
2. 몫이 0이 아니면 1의 과정을 되풀이 한다.
3. 몫이 0이면 마지막 단계의 몫과 나머지들을 역순으로 기록하면 된다.

부동소수점형

부동소수점은 실수를 가수와 지수로 나누어서 표현한다.
ex) 1.49598 * 10^8
(가수부분) + (지수부분)
이렇게 가수와 지수를 따로 표현하게 되면 표현할수 있는 실수의 범위가 늘어난다.

부동소수점 자료형

float 32비트

  • 8비트를 지수에 할당, 24비트를 가수에 할당,유효숫자 6자리

double 64비트

  • 11비트를 지수에 할당 53비트를 가수에 할당
    long double 64비트

실수를 출력하는 형식 지정자

실수 출력시 기본적으로 소수점 6자리 까지만 출력된다.(7자리에서 반올림된다)

반올림해서 마지막에 7출력

printf("%f",0.123456789); // 0.12345"7" 

지수표기법으로 출력하려면 %e나 %E를 사용한다 대소문자는 상관없지만 출력할때 입력한 대소문자에 따라 똑같이 나온다.
%g를 입력하면 소수점 이하 6자리안에서 표현이 가능하면 %f를 사용하고, 그렇지 않으면 %e를 사용하게 된다.

printf("%e",0.123456789); //1.234568e-001 출력

부동소수점 상수

기본적으로 소수점을 이용하여 표현한다. 기본적으로 double형으로 저장된다. 4바이트크기 float형 상수를 만들려면 f나 F를 붙여주면된다.

3.141592 // double형 상수 64비트
3.141592F // float형 상수 32비트

부동소수점 상수는 지수 표기법으로도 표현이 가능하다

123.45 >>> 1.2345e2
12345.0 >>> 1.2345e4

언더플로우

언더플로우: 부동소수점 수가 너무 작아서 표현하기 힘든 상황

ex)float a = 1.23456e-46;

부동소수형을 사용할 경우 주의할 점

정수 산술 연산과는 달리 부동 소수점 연산은 정확하지 않는 경우가 많다. 따라서 오차를 줄이려면 float 보다는 double 을 써야한다.

문자와 아스키 코드

제어문자

\0 널문자
\a 경고
\b 백스페이스
\t 수평탭
\n 줄바꿈
\v 수직텝
\f 폼피드 다음페이지로 넘김
\r 캐리지 리턴 커서를 현재 라인의 시작위치로 옮긴다
\"
\'
\\ 

char beep = '\a';
printf("%c",beep);

정수형으로서 char형

char형은 8비트의 정수를 저장하는 자료형이다. 따라서 문자와 작은 정수값도 저장가능하다.

char	문자및 정수	1바이트 -128~ 127
unsigned char 문자 및 부호없는 정수 0~255

Exercise

  1. 다음의 식별자 중에서 잘못된 것은?
    1. 1st_number
  2. 다음 자료형을 최대값이 작은 것부터 나열하시오.

    char<unsigned char<short<int<long<float<double

  3. 다음 중 C에서 지원하는 자료형의 이름이 아닌 것은?

    3.byte

  4. 다음 중 정수 상수의 표기가 잘못된 것을 모두 고르시오

    0a2,10,000

  5. 다음 중 부동소수점 상수의 표기가 잘못된 것을 모두 고르시오.

    3exp8

  6. 다음 중 문자 상수의 표기가 잘못된 것을 모두 고르시오.

    "a"문자열임, '/z' 문자상수는 오직 하나의 문자만 있어야한다. ('\010' - 올바른 문자 상수로 이것은 8진수 이스케이프 시퀀스로서, ASCII 코드에서 백스페이스 문자다.)

  7. 다음의 정수 상수 중에서 하나의 상수만 값이 다르다. 값이 다른 상수는?

    010

  8. 다음의 상수의 자료형을 적으시오

    int
    double
    float
    int
    char

  9. 다음 변수 이름이 올바른지 아니면 잘못되었는지를 지적하고 그 이유를 써라.

    a) 올바르다
    b) # 사용불가
    c) 숫자로 시작불가능
    d) % 사용불가

  10. 다음의 상수를 지수 표기법으로 변환하시오

    a) 3.141592e+00
    b) 7.165320e+02

  11. 다음 10진수를 8비트의 2의 보수와 16진수로 변환하라.

    p161

  12. 부동소수점형에 대한 설명중 잘못된 것을 모두 고르시오

    일반적으로 정수 계산보다 빠르다.
    정수 연산과는 달리 오버플로우는 발생하지 않는다.
    float는 48비트로 실수를 표현한다.

  13. 다음의 변수를 선언하는 문장 중에서 틀린것을 모두 고르시오.

    int x =10, short y =6;
    unsigned short double x;

  14. 다음의 상수를 printf()를 사용해서 출력하는 경우의 올바른 형식 지정자를 쓰시오.

    printf("%e",1.3e20);
    printf("%x",0xfe);
    printf("%c",'\t');
    printf("%f",10.0f);

  15. float f = 1.234;문장을 컴파일하면 경고메시지가 발생하는 이유는 무엇인가?

    double형이라 float형에 대입하면 경고메세지가 발생한다. 1.234f라고 수정해줘야한다.

  16. 다음의 코드에서 잘못된 부분을 모두 지적하고 올바르게 수정하시오.
    char grade = 'a';
    double rate = 1e10;
    double profit = 75.0;
  
profile
시즌 2의 공부기록 - Artificial Intelligence & AeroSpace

0개의 댓글