#include <stdio.h> |
이런식으로 메모리에 저장이 되는데 비어있는 공간이 생긴다(검은색 칠해진 부분) 이 메모리는 결국사용을 하지 않는다. 과거에는 메모리의 양이 적어서 사용을 하지만 요즘에는 메모리의 용량이 커져서 저 빈공간이 매우 미미한 양이므로 사용하지 않는다.
pc는 보통 32비트이기 때문에 최적화를 시킬때에 4의 배수 --->2의 배수 ---> 1의배수 순으로 최적화를 한다.
pc의 버스가 32비트를 보내면 32 비트를 전송하지만 8비트를 보내면 24비트를 차단시킨후 8비트만 보내기 때문에 32비트 보낼때보다 8비트를 보낼때가 속도가 느리다.
위 그림에서 L을 J앞의 빈공간을 사용해서 보낼수가 있는데 이것이 속도 최적화 방식이다.
pc에서는 메모리가 크기 때문에 메모리 최적화 보다는 속도 최적화에 중점을 둬야하고, 임베디드 에서는 속도 또는 메모리 둘 중 하나를 선택하여 최적화를 해야한다. 상황에 따라 최적화 방식을 선택하면 된다.
#include <stdio.h> |
12 | 34 | 56 | 78 |
0x18 | 0x19 | 0x1a | 0x1b |
이렇게 저장된다고 배웠다.
하지만 실제로는
78 | 56 | 34 | 12 |
0x18 | 0x19 | 0x1a | 0x1b |
0x 12345678 에서 (12)가 start 이고 78이 end 이다
이렇게 거꾸로 저장되는 방식을 Little Endian 방식이라고 하며 인텔에서 쓰고 있는 방식(x86계열)이다.
반대로는 Big Endian 이 있다.
Little Endian 은 Big Endian에 비해서 산술연산이 빠르고 반면 Big Endian은 논리연산에 유리하다.(대소비교가 빠르다)
비트수가 짝수인데 CPU가 2진수로 2의 배수에 특화 되어있기 때문이다.
부호확장
char A = -1;
char B = 0xFF;
char C = 255;
int D = C;
unsigned int E = C;
C를 출력해보면 -1이 나온다.
char C = 255 에 비트를 보면
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
이다 기본적으로 signed 형이기 때문에 -1이 된다.
1바이트를 4바이트에 넣는 경우인데 제일 앞 비트가 1이므로 음수로 치고 1을 앞비트에 다붙인다.
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
이것을 signed 부호확장이라고 한다
unsigned int E = C; 도 E를 출력해보면 애초에 C가 signed 형이기때문에 signed 부호확장이 일어나 -1이 된다.
|
77은
0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
제일 앞이 0이다 0일때는 나머지 비트에 0이 들어가는데 이것을 제로확장 이라고 한다.
*unsigned int D= char C;
형변환이 일어나는데 형변환의 순서는 1바이트를(char)먼저 4바이트로 변화 시키고 int D에 대입하는 순서로 한다.
CPU에서 변환을 시키게 되는데 그때에 원본의 형을 따라서 변환이 일어난다(signed 나 unsigned)
원본의 형이 signed 면 부호확장 unsigned면 제로확장이 일어나게 된다.
'보고서 > 10월 업무일지' 카테고리의 다른 글
10월 19일 업무일지 (0) | 2010.10.19 |
---|---|
10월 18일 업무일지 (0) | 2010.10.18 |
10월 13일 업무일지 (0) | 2010.10.13 |
10월 12일 업무일지 (0) | 2010.10.12 |
10월 11일 업무일지 (0) | 2010.10.11 |