안녕하세요. 스마트 팩토리입니다.
c 언어[007] 자료형(데이터 타입) short, int,long, float, double, char 등 표현가능한 수의 범위에 대해 알아보겠습니다.
데이타 타입과 자료형에 대한 것은 한번은 알아두고 암기해두고 가야 합니다. 이는 c언어와 자바, 파이썬에서 주로 다루고 있고 시작 단계에서 변수와 관련하여 변수의 타입, 자료 공간의 크기(바이트 수)와 표현가능한 수의 범위까지 알아볼 필요가 있습니다. 오류냐 에러가 발생했을때 디버깅 과정에서 빠르게 찾아낼 수 있어서 코딩을 하는데 어려움이 없습니다. 기초 중에 기초가 되겠습니다.
1. 자료형 데이터 타입 c 언어[007] 자료형(데이터 타입) short, int,long, float, double, char 등 표현가능한 수의 범위
c 언어에서 자료형은 너무나 중요한 기초입니다. 이는 수학을 할때 구구단정도로 너무나 필수적인 내용입니다. 그래서 여러번 하다보면 이해할 수 있습니다. 사람들 사이에서는 아무런 부담없이 쓰는 문자와 숫자가 기계가 이해할 수 있는 언어로 표현을 하다 보니 고안해 낸 방법인데 그런 측면에서 c언어는 정말 잘 만들어진 언어입니다. 그래서 저급언어와 고급언어의 중간에 위치해 있어서 지금까지 꾸준히 사용하고 일부 다른 프로그래밍 언어를 이해할 때 c언어를 배워야 하는 이유가 여기에 있지 않나 싶습니다. 저도 자료형(자료구조) 부분을 볼때면 처음에는 암기하려고 하지 않았는데 표현가능한 수의 범위까지도 이해하고 암기해 보는 것도 추후적으로 프로그래밍 언어를 이해할때 나름 헷갈리지 않고 좋습니다.
자바에서의 데이터 타입의 바이트수가 조금 다르고 한 것은 있지만 헷갈릴 정도는 아닙니다. 그래서 한가지를 확실히 이해하고 나면 다른 언어에서도 부분 변형만 있을 뿐 의미하는 바는 비슷합니다. 이는 파이썬에서도 비슷합니다. (1)
(1) 1바이트 표현 가능한 범위
1바이트는 8비트입니다.
8비트로 표현할 수 있는 수의 범위는 2^8=256 이어야 하나 (2진법체계) 앞의 1비트는 부호 비트로 +,- 를 표현하기 위해서 뒤에 7비트만 사용합니다. 그래서 총 128 에 양, 음의 부호를 가지게 되어 256개 입니다. 하지만 부호의 전환점인 0을 표현하기 위해서 양의 128 대신 0으로 표현하게 되어
8비트 = 1바이트의 표현가능한 범위는 256개 로 -128~+127입니다.
unsigned가 붙은 경우는 음수를 표현하지 않고 0 부터 양수 부분입니다.
그래서 2^7 =256개로 0 부터 시작하면 255개 가 됩니다.
이런 방식으로 2바이트의 경우 2^15에 음과 양수, 4바이트의 경우는 2^31에 음과 양수입니다. 그럼 위의 표현가능한 수의 범위가 이해가 될 것입니다.
https://blog.naver.com/kji9653/221913097313
(2) 실수형 float, double 형의 표현가능한 수의 범위
실수형을 표현할때는 2진법으로 메모리에 저장되게 됩니다. 그래서 10진수를 우선 표현을 하고 2진법으로 변형하여 저장하게 됩니다.
예를 들어) 32.123 10진수를 지수와 가수로 표현하면 3.2123*10^(-1)이 됩니다. 여기서 지수부는 -1 이고 가수부, 즉 소수는 3.21123입니다. 간단하게 보면 이렇습니다. 하지만 컴퓨터가 이해할 수 있는 기계어로 바꾸기 위해서 2진법을 사용합니다.
https://ko.wikipedia.org/wiki/%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90
부동 소수점의 경우는 대략적으로 표현할 수 있는 범위만 파악하고 있으면 됩니다. 자세한 것은 따로 설명이 필요한 부분이기 때문에 2진법으로 표현하여 지수와 가수부로 나타내는 방식을 선택하여 수의 정밀도를 높여줍니다.
진법 변환은 따로 포스팅을 하도록 하겠습니다.
#include<stdio.h>
void main() {
float a = 12.345;
double b = 12.345678901234;
printf("%d \n",sizeof(a)); --> 변수 a 의 크기를 알아보기 위해서 4바이트를 의미하는 4가 나옵니다.
printf("%f \n",a); --> 10진수의 유효숫자 6자리까지 7번째 자리수는 반올림되는 경우가 많아서 표현상은 7자리지만 그 앞자리까지 유효숫자로 생각하면 됩니다.
printf("%d \n", sizeof(b)); --> 변수 b 의 크기를 알아보기 위해서 8바이트를 의미하는 8 이나옵니다.
printf("%e \n", b); --> 지수로 출력해 보았습니다.
}
double 형의 경우는 바이트 8바이트임을 알 수 있고 표현할 수 있는 범위에서 유효 숫자 범위도 14자리까지는 정확도가 있다할 수 있습니다.
#include<stdio.h>
void main() {
double b = 12.345678901234; 123.1234567890123;
printf("%d \n", sizeof(b));
printf("%e \n", b);
printf("%1.2f \n", b);
printf("%1.8f \n", b); ---> 소수점 아래 8짜리까지 표현하다 보니 9짜리에서 반올림한 결과입니다.
printf("%1.12f \n", b); --> 소수점 13자리에서 반올림하여 표현
}
%1.15f의 경우는 확실히 정확도가떨어진다는 것을 알 수 있습니다.
수학적으로 생각해 보면 소수점 이하 12자리로 가면 정말 작은 수 입니다. 하지만 천문학의 단위로 넘어가면 의미있는 숫자가 되어 프로그램상에서 큰 문제를 가져오기는 하지만 초기에 배우는 단계에서는 대략적으로 float와 double의 출력값의 범위 정도면 보통의 문제는 거의 해결 할 수 있을 것입니다.
댓글