바이너리 데이터 : 프로그래밍 언어나 프로그램에서 사용되고, 화면에 출력되는 숫자나 문자열 등이

실제로 메모리에 저장되는 16진수의 형태. 숫자 1의 바이너리 데이터와, 문자열 1의 바이너리 데이터는

다른 값으로 저장된다.


텍스트 데이터 : 바이너리 데이터 중, 문자 코드로 표현이 가능한 데이터. 값 중간에 NULL이 올 수 있냐 없냐 

차이가 바이너리와 텍스트 데이터의 가장 큰 차이. 텍스트 중간에 NULL이 있으면 그 전까지만 텍스트로 

출력 되고, 이 후 데이터는 출력 안됨.


스트림 : 데이터의 흐름, 데이터 전달 되는 모습? 통로?. 예로 파일 스트림을 사용하여 문자열, 정수값 등을 파

일에 바이너리 데이터로 저장 한다.


인코딩 : 문자열을 표현하기 위한 코드 값. 예로 아스키, UTF8, UTF16 등등

Posted by Yann'
,

*인터넷 뒤지며 얻은 정보를 개인 적으로 종합, 정리 하였음.

- 라인 피드 (LF : Line Feed, 0x0a) : 캐럿을 다음 줄(현재 위치에서 바로 아래)로 이동 시킨다.

- 캐리지 리턴 (CR : Carriage Return ) : 캐럿을 줄의 맨 앞으로 이동 시킨다.

즉 모두 '줄 바꿈'과 관련이 있는 문자다.


줄 바꿈에 대한 정의는 시스템(OS), 언어 마다 다르다.

- 유닉스/리눅스 : LF만으로 줄 바꿈을 정의 한다.

- 윈도우/DOS : CRLF 조합으로 줄 바꿈을 정의 한다.

- C언어 : 유닉스 태생으로 LF만으로 줄 바꿈을 정의 한다.


위와 같이 유닉스/리눅스 시스템과 윈도우/DOS 시스템의 줄 바꿈에 대한 정의에 차이가 있다.

프린터나 타자기?와 같은 장비에선 LF로 캐럿의 위치를 현재 위치에서 바로 아래로 이동 하며 CR을 통해 줄의 맨 앞으로

이동 시키는 CR/LF (LF/CR과 다르다)의 조합을 통해서 줄 바꿈이 이루어 지는데

윈도우와 DOS는 이를 그대로 따라 가고 있다.(시스템 입장에서 보면 불편 한듯?)

따라서 윈도우의 파일을 그대로 리눅스로 옮기면 문자열 맨 끝에 '\r\n'이 붙게 되며

이를 리눅스 프로그램에서 그대로 사용시 문제가 발생할 소지가 있다.


윈도우와  DOS의 경우 C의 줄바꿈에 대한 정의와 차이가 있다.

즉 윈도우와 DOS에서 작성된 C프로그램이 줄바꿈을 '\n'으로 입력하면 하거나 읽어들이면

실제 파일에 '\r\n'으로 기록 되거나 읽히게 된다.

이러한 차이를 없애기 위해 fopen 함수 호출시 두번째 인자로 'b'(바이너리 모드)를 주지 않게 되면 C 라이브러리에서

'\n'을 '\r\n'으로 인식 하게 된다. 그러나 이 경우 두개의 '\r\n' 문자를 하나의 '\n' 문자로 인식 하기 때문에

파일 크기를 다루는 상황 등에서 문제가 발생할 수 있다.



 

Posted by Yann'
,

정수 표현시에 반올림을 적용하면 0~4까지는 내림, 5~9까지는 올림수가 된다.

한 예로 1의자리 반올림을 하면

14 - > 10

15 - > 20

이와 같이 변한다. 하지만 소수점은 어떻게 적용이 될까??

소수점 이하 첫째자리까지만 표시하도록 해보았다.


float a = 0.54;

float b = 0.55;

float c = 0.56;


printf("%f\n", a);      - a1

printf("%0.1f\n", a);  - a2

printf("%f\n", b);      - b1

printf("%0.1f\n", b);  - b2

printf("%f\n", b);      - c1

printf("%0.1f\n", b);  - c2


이때 출력값은

a1 : 0.54    a2: 0.5 (예상 결과 0.5)

b1 : 0.55    b2 : 0.5 (예상 결과 0.6)

c1 : 0.56    c2 : 0.6 (예상 결과 0.6)


어째서 b의 결과는 예상 결과와 상이한 것일까?

0.55를 소수 첫째자리까지 반올림하면, 두번째 자리 5가 올림되어 0.6되는게 아닌가?


해석.

2진수 컴퓨터 체계에서 숫자는 정수부분과 실수부분으로 나뉜다.

이때 정수부분 표현은 어떤수라도 표현 가능 범위에만 있으면 100% 정확하게 표현이 가능하다.

하지만 실수 부분은 그렇지 않은데 

0.5 = 0.1 (2)

0.25 = 0.01 (2) 와 같이 2진수로 맞아 떨이지게 계산되는 수가 있는가 하면

0.55 = 0.1000110011001100....(2)와 같이 떨어지지 않는 수도 있다

즉 2진수 체계에서는 실수를 정확하게 표현할 수 없다.


위의 예를 돌아가 보자.

입력 값들은 실제 다음과 같은 값으로 저장되어 있다.

0.54 = 0.539559..... (출력시에는 0.54로 보임)

0.55 = 0.5487....     (출력시에는 0.55로 보임)

0.56 = 0.558......     (출력시에는 0.56으로 보임)

즉 가장 근사한 값일 뿐이지 실제 0.55를 입력했다고해서 메모리에 0.55가 정확히 저장되어 있지 않는다.

그렇기 때문에 소수점 첫째자리까지 출력한다고 하면.

입력한 0.54 -> 0.5가 되는 것이 아니라 0.539559 -> 0.5가 되고

입력한 0.55 -> 0.6이 되는 것이 아니라 0.5487 -> 0.5가 되고

입력한 0.56 -> 0.6이 되는 것이 아니라 0.558 -> 0.6이 되는 것이다.



결론.

컴퓨터에서 소수점 이하 출력시에는, 입력한(눈에 보이는) 값 자체로 반올림을 따지면 결과가 다르고,

실제 저장된 값을 확인해 봐야 한다.


Posted by Yann'
,