인삿말
안녕하세요 여러분.
잘 지내고 계신가요?
저는 종강한 지 얼마 안 돼서
이제 좀 한가해진 것 같습니다!
더위와 코로나까지 정말
힘든 시기인 것 같네요ㅜㅜ
이럴 때 일수록 다 같이 힘내서 공부하도록 해요!
2020/07/17 - [프로그래밍언어/c언어] - C언어 독학 #7. 비트 체계와 비트 연산자
자료형이란?
지금까지 데이터를 저장하기 위해
변수를 사용했습니다.
이 변수에는 다양한 데이터들을 저장할 수 있는데요.
이러한 데이터들의 형식을 자료형이라고 합니다.
자료형은 크게 정수형과 실수형으로 나뉩니다.
정수형- char, short, int, long
실수형- float, double, long double
정수형, 실수형에서 또 세부적으로 나뉘는데
이는 크기에 따라 구분됩니다.
메모리 공간을 효율적으로 사용하기 위해
상황에 맞게 자료형을 사용하게 됩니다.
sizeof 연산자를 통해 자료형의 크기를 확인 할 수
있습니다.
sizeof 연산자를 사용해 %d 포맷으로
출력시키면 그 결과값들을 얻을 수 있습니다.
일반적으로 c언어에서 제공하는 자료형의
메모리 크기는
위와 같다는 것을 확인 하실 수 있습니다.
정수형
위에서 세부 자료형의 메모리 크기에 대해
알아봤습니다.
이번엔 정수형의 세부 자료형에서 데이터를 표현할 수
있는 범위에 대해 알아보겠습니다.
범위를 알아보기 위해 범위의
최솟값과 최댓값을 알려주는
시스템 라이브러리 limits.h를 사용해
알아보겠습니다.
각 자료형의 범위를 출력하기 위해
최솟값 최댓값을 나타내는 상수를
사용했습니다.
각 범위를 출력한 결과입니다.
전 글에서 2의 보수와 함께 비트 체계에 대해
알아봤는데요.
첫 비트는 부호를 나타낸다고 했습니다.
char 형은 메모리 크기가 1바이트
즉, 8비트로
256개의 숫자를 표현할 수 있는데
첫 비트는 부호를 의미하므로
범위가
0 ~ 255 이 아닌
-128 ~ 127 이 됩니다.
나머지도 마찬가지 입니다.
따라서 n이 비트 수라고 하면
범위는
-2^(n-1) ~ 2^(n-1)-1
로 정의할 수 있습니다.
지금까지 부호가 있는 정수형 자료형에 대해
알아봤습니다.
키워드 unsigned를 붙여서
부호가 없는 정수형 자료형으로
정의할 수 있습니다.
일반적으로 signed 키워드는 생략되기
때문에
따로 쓰지 않는 것입니다.
unsigned의 경우 0과 양수만 쓰기 때문에
양수 부분의 범위가 두 배가 됩니다.
선언 예)
unsigned int num;
메모리 크기가 1 바이트인 char형 보다도 일반적으로 정수를 사용하는 변수의 자료형으로 int를 선호
cpu가 가장 빠르게 처리하는 자료형이기 때문입니다!
이건 그냥 알고 있으면 될 거 같습니다.
실수형
이번엔 실수형의 세부 자료형에서 데이터를 표현할 수
있는 범위에 대해 알아보겠습니다.
실수의 범위를 알아보기 위해
실수형 데이터 범위의
최솟값과 최댓값을 알려주는
시스템 라이브러리 float.h를 사용해
알아보겠습니다.
각 자료형의 범위를 출력하기 위해
최솟값 최댓값을 나타내는 상수를
사용했습니다.
각 범위를 출력한 결과입니다.
위의 코드를 보면 서식 %e로 실수를
출력했습니다.
%e 서식을 사용하면 매우 큰 실수형을
지수 형태로 출력하는 장점이 있습니다.
정수형 자료형에서는 int형을
선호한다고 했습니다.
실수형에서는 float형보다 double형을 선호
float형 보다 더 정밀하게 계산을 하기 때문입니다.
float형은 소수점 이하 6자리까지 표현할 수 있고
double형은 소수점 이하 15자리까지 표현할
수 있습니다.
문자형
컴퓨터는 문자를 인식하지 못하기 때문에
ASCII 코드로 숫자를 이용해서 문자를 인식할
수 있게 표준을 정해서 사용하고 있습니다.
ASCII 코드란 American Standards Committee for Information Interchange의 약자로
숫자에 매핑된 문자를 확인할 수 있습니다.
아스키코드는 0부터 127까지 구성되어 있기 때문에 -128 ~ 128까지의
범위를 갖고 있는 char 자료형으로 사용하기 적합합니다.
char value;
value = 'a';
printf("%c는 %d \n", value, value);
value = 'b';
printf("%c는 %d \n", value, value);
<실행 결과>
a는 97
b는 98
서식 포맷 %c로는 아스키코드에 매핑된 문자를 출력하고,
% d는 아스키코드값을 출력합니다.
자료형 변환
c언어에서는 같은 자료형의 연산이 이루어지는 것이 좋지만,
다른 자료형과의 연산이 이루어지는 경우도 있습니다.
이럴 때 발생하는 것이 자료형 변환입니다.
자동 형 변환
컴파일러가 자동으로 자료형을 변환해줍니다.
자료 형 변환의 우선순위에 의해서 피연산자를 자동으로
자료형 변환을 시킨 뒤 연산을 하게 됩니다.
long double <- double <- float <- long <- int <- char
int num1 = 12;
double num2 = 10.2
printf("%d + %lf = %lf \n", num1, num2, num1 + num2);
// 12 + 10.200000 = 22.200000 출력
자료형 변환 우선순위에 의해 num1이 자동으로
double형으로 형 변환이 일어난 뒤 연산이 수행되어
위와 같은 결과를 얻습니다.
대입 연산자의 경우
연산자의 오른쪽 피연산자의 자료형이
왼쪽 피연산자의 자료형으로 자동으로
형 변환되지만
더 큰 자료형에서 작은 자료형으로 대입 연산을 할 경우
데이터 손실이 발생하므로 가급적이면 하지 않는 것이 좋습니다.ㅜㅜ
double num1 = 23.32;
int num2 = num1;
printf("%d \n", num2);
// 23 출력
강제 형 변환
강제 형 변환은 컴파일러가 하는 것이 아니고,
프로그래머가 하는 것입니다.
int num1 = 10;
int num2 = 3;
printf("%lf \n", num1/num2);
// 3.000000 출력
printf("%lf \n", (double)num1/num2);
// 3.333333 출력
왜 위와 같은 결과가 나올까요?
첫 번째 연산 num1/num2은
두 정수형 피연산자가 연산을 통해
3이라는 정수형 결과를 얻게 되고
대입 연산에 의해 자동 형 변환이 일어나
3.000000
의 결과를 얻습니다.
두 번째 연산 (double) num1/num2은
num1이 강제 형 변환으로
실수형이 되고, 오른쪽에 있는 피연산자는
자동 형변환으로 같이 실수형이 되어
연산이 됩니다.
따라서
3.333333
의 결과를 얻습니다.
감사합니다.ㅎㅎ
'프로그래밍언어 > c언어' 카테고리의 다른 글
C언어 독학 #10. 조건문 (0) | 2022.07.17 |
---|---|
C언어 독학 #9. 반복문 (2) | 2022.07.09 |
C언어 독학 #7. 비트 체계와 비트 연산자 (0) | 2020.07.17 |
C언어 독학 #6. 연산자 (0) | 2020.05.13 |
C언어 독학 #5. 상수 변하지 않는 데이터 (2) | 2020.05.12 |