2012년 10월 1일 월요일

정수와 실수를 사용할 때의 자료형 고르는 방법

1.정수

우리는 프로그래밍을 할 때, 흔히 정수를 사용한다.

그런데, 자료형에는 크기가 정해진다.

그렇다면, int는 4비트 longlong은 8비트인 것 처럼, 그렇다면 함수 long long이 더 많은 자료를 저장하기 때문에, 정수를 저장할 때는 longlong만 쓰는게 효율적일가요?라는 질문에 '네'라는 대답이라고 할 수 없다.

왜냐하면, 조금만 더 생각해보자.

MP3에 곡을 추가하려는데, 여분 공간이 7MB밖에 남지 않았다. 그런데, 이 두 곡은 꼭 넣고 싶어한다.

그리고, 이 두 곡의 파일크기가 서로 다른 4개의 파일이 있다.

고음질 파일에 5MB와 중저음질의 3MB가.

당연히 중저음질파일을 넣는게 당연하다.  여분의 공간을 효율적이게 사용하려고. 비록 선명한 목소리를 듣진 못하지만.

뭐, 대충 이런 논리이다.

한마디로 상황에 따라 다르다. 만약 여분공간이 11MB였다면 고음질 두 개를 넣었을 것이었던 것처럼, 또 저음질을 더 넣었을 수도있다.

결론은 값의 범위를 많이 쓸 필요가 없다면 제일 크기가 제일 작은 char함수를 쓰는게 효율적이라는 것이다.

이번엔 프로그래밍으로 예를 들어보겠다.
 

8-9줄에 분명 사진에는 1바이트끼리 더한 것과 2바이트끼리 더했지만은 똑같이 4바이트가 나왔다.

그 이유는 나도 궁금했다. 과학에 예외란 것이 있는 것 처럼, 내 호기심을 자극했다.

책에 의하면, 이유는 int형의 연산이 CPU가 계산하기 제일 좋은 연산이다보니 int형보다 작은 계산은  int형의 연산으로 바뀌어 계산한 것이다.

근데 왜 밑에 연산은 int형 연산으로 바뀌지 않은 것인가?

그 이유는 미리 초기화로 인해 미리 저장했기 때문이다.

마지막으로 int보다 작은 크기의 계산은 int로 바뀐다면, char이나 short의 자료형은 필요 없는 것인가?에 대한 질문에 답은 속도보다 크기가 중요해서 작은 크기의 연산이 필요한 데이터들에서는 int보단 short char이 더 필요하게 될 것이다.

2.실수

실수 자료형   | 소수점 이하 정밀도   | 바이트 수
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
float                 | 6자리                    | 4바이트
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
double              | 15자리                  | 8바이트
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
long double       | 18자리                  | 12바이트
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

대부분의 프로그래머들이 사이즈가 부담되지 않고, 그렇다고 소수점 정밀도가 낮지도 않은 double을 많이 사용한다고 한다.

프로그래밍으로 실험을 해보겠다.
5,6번 줄: 원의 넓이를 구할 때에 다들 알다시피 반지름x반지름xπ 인 것을 알 것이다.
이 식에서 π는 3.1415.....의 수로 크기를 딱 정할 수 없는 애매한 값이다. 그런데 이 수를 이용해 원의 넓이를 구하는 것은 어느정도의 정밀도를 필요로하는 double함수를 사용했다.

8,11번 줄: 이건 꼭 알아야하는 것이다. 실수 출력은 f% 입력은 lf%, lf%는 숫자1이 아닌 알파벳 소문자 l(엘) 이다.※주의할것은 %Lf와 %lf와는 다른 서식문자이다.


값은 누구나 알듯이 .

이번엔 정밀도가 약한 float 함수를 사용해보겠다.


 위의 실험에서 double함수를 float 함수로 바꾼 식이다.


결과는 에러가 나온다.

계산을 못하는것이다.


3. 0과 양의 정수만 표현하게 할 수 있는 함수 unsigned

자료형 앞에 unsigned를 붙이면 범위는, 그 자료형의 음수를 제외한 0부터 최댓값까지의 수를 표현한다.

ex) unsigned double

여기에도 예외는 있다. char자료형은 unsigned char와 다른 함수로 선언일 수 있다.

왜냐하면 그냥 char함수를 아예 unsigned char로 인식하는 컴파일러도 존재하기 때문이다.

그래서 혹시나 char로 할때, 자동으로  unsigned함수로 되는 것을 방지하기 위해 sign char로 하는 경우도 있다.

잘 따라오셨나요? 시험기간때문에 오랜만에 올린 포스트였습니다.

다음 포스트에서 뵈요.

댓글 없음:

댓글 쓰기