난 이상하게 기초 CS 공부할 때가 재밌는 것 같다.
늘 컴퓨터가 어떻게 동작하는지 알고 싶었어서 그런가, 역시 사람은 하고싶은 걸 해야한다.

내 마음속에 저장 ☆
은 당연히 아니고.. 이전포스트에서 정보는 비트와 컨텍스트로 이루어진다고 했고 메모리에 저장된다고 했다.
즉 컴퓨터에서 정보의 저장이라 함은 '1'과'0'으로 이루어진 무수한 '0101010111' 을 메모리에 저장한다고 볼 수 있겠다.
이 메모리에는 각각 '주소'가 붙어있는데 메모리는 이 주소가 들어있는 거대한 바이트의 배열(처럼보임)인다. 실제로는 거대한 바이트의 배열은 아니지만 컴퓨터가 여러가지 기능을 사용해서 프로그램에게 그렇게 보이게 만들어준다.
주소 값
---------------
Ox2000 Ox12
Ox2001 Ox34
Ox2002 Ox56
Ox2003 Ox78
이 주소가 모여있는 저장공간이 있는데 이를 "가상주소공간" 이라고 한다.
실제로 메모리에 계속 값이 들어있지는 않지만 해당 주소로 요청이 들어오면 운영체제가 물리적 저장장소에서 메모리로 이동시킨 후, 프로그램의 요청을 처리한다.
이 가상주소 공간의 크기는 2^워드크기 - 1 인데.
워드크기는 CPU가 한 번에 처리할 수 있는 기본단위다.
ex) window32 bit = 4BYTE , window64 bit = 8BYTE
4바이트인 경우 가상 주소공간은 4GB 정도 되지만 8BYTE 인 경우는 엄청나게 크기가 커진다.
이 메모리 주소를 보면 현재 16진수로 표현된 것을 볼 수 있다.
왜 16진수로 메모리 주소를 표현하게 되었을까?
메모리 주소는 1byte(8bit) 값인데 이걸 각각 표현 방식을보자
이 16진수를 저장하는 데에도 방법이 있다.
리틀레디안과 빅레디안의 성능차이는 아예없다고 봐도 좋다.
그래서 어떤게 더 좋냐고 개발자들끼리 싸울 때, 감정적이 된다고 한다.
난 F 싫어.
개념은 이렇다.
int 자료형의 16진수 메모리가 있다고 하자.
int 자료형은 4BYTE 이므로
int = Ox12345678
이런 주소가 생성될 것이다.
이걸 1BYTE 씩으로 나누면 (Ox12, Ox34, Ox56, Ox78) 이 되는데
이걸 16진수 표기법으로 나타내면
12 * 16^3 + 34 * 16^2 + 56 * 16^1 + 78 * 16^0
이다.
그래서 숫자의 크기가 Ox12 > Ox34 Ox56 > Ox78 가 되는데
컴퓨터는 "숫자의 크기가 큰 것을 더 중요한 데이터라고 판단한다"
리틀레디안과 빅레디안은 어떻게 다를까?
리틀레디안은 이렇게 표기한다.
=> Ox78563412
중요도가 낮은 순서대로 배치한다.
빅레디안은 이렇게 표기한다.
=> Ox12345678
그래서 실제로 C에서 포인터 변수를 만들었을 때, 리틀레디안인지 빅레디안인지에 따라
멀티 바이트 객체 ( 바이트를 여러개가지는 객체 char = 1 Byte , int = 4 Byte ) 의 메모리 위치가 달라진다.
왜냐하면 멀티바이트객체의 주소는 최소바이트의 주소이기 때문이다.
리틀레디안과 빅레디안은 이 최소바이트의 주소를 다르게 정한다.
네트워크 통신할 때의 문제
이 차이는 네트워크 통신일 때 문제가 되는데
송신 ======= 네트워크 표준으로 변경 =======> 네트워크
네트워크 ======== 내부바이트 표시방식으로 변경 ======> 수신
이렇게 송신측과 수신측에서 바이트 표시방식을 변경해줘야 한다.
어떻게 정보가 표현되고 어떻게 저장되는지 조금 더 이해할 수 있는 공부였다.
이 공부들을 토대로 c언어를 배우고 핀토스까지 진행한다면
진짜 제대로 알고있는 개발자가 될거같아서 기쁘다.