변수는 데이터를 저장하기 위한 메모리 공간의 이름이다. 변수는 자료형으로 메모리 공간의 크기와 형태를 나타낸다.

 

- 자료형

 

자료형 / 명칭 크기 (1 byte = 8 bit)
정수형 char 1 byte
short 2 byte
int 4 byte
long 4 byte
실수형 float 4 byte
double 8 byte

 

- 메모리

 

메모리는 데이터를 저장할 수 있는 저장 장치로 주기억 장치(RAM, ROM 등), 보조기억 장치(CDROM, HDD, FDD 등) 등을 말한다.

 

RAM(Random Access Memory)의 특징 : 선형구조로 되어있으며 속도가 빠르고 데이터가 저장되지 않는 휘발성 특징을 갖고 있다.

 

메모리 공간은 주소값을 가지는 Header부분과 Data를 가지는 영역으로 나뉜다.

여기서 잠깐 메모리 포맷에 대해 이야기 해보겠다.

  • 하이 레벨 포맷(High Level Format - HLF) : 흔히 format c: 로 하는 포맷의 방식이며, 모든 자료를 지우거나 운영체제를 지우고 재설치 할때 사용한다. 기존에 데이터가 남아있는 경우 이 포맷으론 실제 파일은 사라지지 않고 실제 데이터는 그대로 남아있다. 기존의 데이터를 없던 것으로 간주하여 무시하기 때문이다. 파이널 데이터 같은 복구 프로그램은 하드 디스크의 전체 혹은 일부만 다시 수색하여 파일의 존재를 다시 살려냄으로써 복구한다.

  • 퀵 포맷 : 위의 하이 레벨 포맷에선 FAT를 지우고 몽땅다 0x00으로 복붙하고, 이 값으로 루트 디렉토리를 청소시킨 후, 클러스터를 다 검사하여 배드섹터를 매기는데, 여기서 FAT만 지우거나, 배드섹터 검사를 빼버리는 방식이다. 0x00은 NULL(아무것도 없는 상태)이다. 즉 하드의 파일을 NULL로 덮어씌워 버린 다음, 최상위 폴더를 청소한 뒤 클러스터(할당 단위라고 부르기도 하며, 파일과 폴더에 대해 디스크 공간을 할당하는 단위다.)를 검사하여 배드섹터(하드의 저장 공간이 일부 손상되어 그 부분을 읽어들일 수 없는 경우)를 판단한다. 이건 하이레벨 포맷이고, 퀵 포맷은 NULL로 덮어씌워 버리기만 하고 검사 부분을 생략하는 방식이다.

  • 로우 레벨 포맷(Low Level Format - LLF) : 일명 공장 초기화. 단순하게 지우는것이 아닌 하드 디스크의 모든 섹터를 하나하나 엎어버려 완전 공장 출하 상태로 돌려놓는 것. 안의 섹터를 하나하나 뒤집어 엎기 때문에 시간도 오래 걸리고 하드디스크에 무리도 많이 간다. 또한 데이터를 복구하는 것도 일반인 수준에서는 불가능하다 실제로 하드가 긁혀서 생긴 상처 등으로 인한 물리적인 배드섹터 가 아닌 바이러스 등으로 인해 생긴 논리적 배드섹터는 로우 레벨 포맷으로 살릴 수 있다고 한다. 하지만 현대식 하드디스크(SATA ATA)는 이 방식을 사용할 수 없다 사실상 제조사에서 푸는 전용툴은 전부 퀵포맷인 제로필이다 현대식 하드디스크는 진정한 로우포맷을 하려고 하면 아예 자체에서 거부하거나 OK명령어만 보내고 아무반응하지 않는다. 외래어 표기법에 맞는 표기는 로 레벨 포맷이므로 이 용어로도 검색이 가능하다.

옛날에는 로우 레벨 포맷, 하이 레벨 포맷, 퀵 포맷을 나누어 사용했으나, 현재 로우 포맷은 시간이 너무 오래 걸리고, 자칫 잘못하면 HDD 자체를 망가뜨리기 때문에 공장에서만 가능하도록 막혀 있다. 그래서 일반 사용자가 할 수 있는 로우 포맷은 엄밀히 말해 로우 포맷이 아니라 제로 필이라고 해서 해당 저장장치의 모든 영역에 제로(0)를 기록하여 기존에 있는 데이터를 덮어씌우는 방식이다(윈도 비스타 이후 윈도 운영체제에서 일반포맷은 이러한 방식이다). 하이 레벨 포맷 또한 퀵 포맷 + 디스크 검사로 대체되는 추세이다. 하드디스크 제조기술의 발전으로 예전처럼 정밀하게 읽기/쓰기검사를 하지 않아도 일상 생활용으로는 충분한 안정성이 확보되었기 때문이며, 데이터의 안전을 위해서는 백업이 가장 좋은 방법이다.

 

-출처 : 나무위키

 

 

메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법으로 엔디언이라는 것이 있다.

 

엔디언은 크게 빅 엔디언과 리틀 엔디언으로 나뉜다.

 

빅 엔디언은 사람이 숫자를 쓰는 방버과 같이 큰 단위의 바이트가 앞에 오는 방법이고, 리틀 엔디언은 반대로 작은 단위의 바이트가 앞에 오는 방법이다.

 

종류 0x1234의 표현 0x12345678의 표현
빅 엔디언 12 34 12 34 56 78
리틀 엔디언 34 12 78 56 34 12

 

빅 엔디언에는 MACOS, UBUNTU, 안드로이드, IOS가 있고,

리틀 엔디언에는 Window가 있다.

 

그렇기 때문에 리눅스나 MAC에서 복제한 메모리를 Window에서 사용하려고 하면 메모리를 제대로 불러오지 못한다.

그런데 Window에서 복제한 메모리는 MAC이나 리눅스에서 정상적으로 작동한다. 이것은 왜일까?

그 이유는 간단하다. 리눅스와 MAC에서는 메모리를 읽어올 때 엔디언을 변환해주는 기능이 탑재되어있기 때문이다.

리눅스는 읽고 쓰기가 전부 가능하지만 MAC은 읽기만 허용한다.

위 그림의 차이점이 무엇일까?

 

위의 예시는 char형 A에 5를 초기화 시켜주고 int형 B에 A를 대입하였고,

아래의 예시는 int형 B에 5를 초기화 시켜주고 char형 A에 대입하였다.

 

메모리 사용 기준은 Window이며, char형의 크기는 1byte이기 때문에 주소값이 하나이지만

int형은 주소값이 4개이기때문에 엔디언방식이 다르다면 저장된 값을 찾을 수 없는것이다.

 

int A = 0xFFFFFF;

char B;

char C;

char D;

 

RGB값을 가지고 있는 int A가 있다. RGB각각의 값을 char B, C, D 에 넣어주려 한다. 어떻게 해야할까?

 

답은 간단하다.

 

char 포인터 변수를 선언하여 A의 주소를 가리킨다.

 

char *p = &A; (언어에 따라 강제 형변환을 해줘야할 수 있다.)

 

B = *p;

C = *(p + 1);

D = *(p + 2);

 

(주소값에 +1을 하면 다음 주소를 가리킨다.)

 

위와같이 포인터를 사용하여 int의 값을 나누어 사용할 수도 있다.

단, FF의 값은 255이므로 unsigned를 사용하지 않는다면 원하는 값이 나오지 않을 것이다.

'프로그래밍 > C 포인터' 카테고리의 다른 글

3. 배열  (0) 2020.02.17
2. 포인터  (0) 2020.02.12