c언어 수업을 여러번 들었지만 union은 거의 써본 기억이 없다.
그러다가 오늘 봉기가 올린 acm tutorial보고 생각이 나서 정리한다.
먼저 structure
- structure
한글로 하면 구조체, 동일하지 않은 타입을 가진 데이터들의 집합.
쉽게 풀자면 int a, int b 이런식으로 같은 데이터 타입 여러개를 정의하기 힘드니
한방에 묶은것이 array(배열), 배열을 쓰자니 처음에 선언한 타입한개밖에 못써서, 다른 타입도 같이 묶고 싶어 하면서 쓰면 structure(구조체)
- union
한글로 하면 공용체, 동일하지 않은 타입을 가진 데이터들의 집합, 하지만 같은 메모리 공간을 사용.
프로그램 코드의 다형성을 구현하기 위해 존재, 비슷한 동작을 하지만 동작의 대상이 되는 타입이 여러개 일때 사용.
union test
{
int a;
char c[4];
};
위 두개 변수는 같은 공간을 사용
32비트 기준, int의 4바이트와 char의 1바이트 4공간은 같은 공간을 사용한다.
만약 int에 16진수 0x12345678을 저장했다면
char 배열을 출력해 보면 0x12, 0x34, 0x56, 0x78과 같이 나온다.
같은 공간을 사용하기 때문이다.
만약 short형으로 배열을 주었다면
0x1234, 0x5678과 같은 식으로 출력될 것이다.
위의 출력순서는 Endianness에 따라 다르다.
- Endianness
컴퓨터 메모리와 같은 1차원 공간에 여러 개의 연속된 배상을 배열하는 방법.
바이트를 배열하는 방벅을 특히 Byte order라 함
큰 단위가 앞에 나오는 것을 Big-endian
작은 단위가 앞에 나오는 것을 Little-endian
둘 다 지원하거나, 둘 다 속하지 않는 것을 Middle-endian 이라고 한다.
방식에 따라 성능이 압도적으로 좋거나 나쁘지는 않음
x86시리즈(인텔) : Little-endian 사용
네트워크, 모토로라 프로세서 : Big-endian 사용
ARM 프로세서 : 둘 중 선택 가능
종류 | 0x1234의 표현 | 0x12345678의 표현 |
---|---|---|
빅 엔디언 | 12 34 | 12 34 56 78 |
리틀 엔디언 | 34 12 | 78 56 34 12 |
미들 엔디언 | - | 34 12 78 56 또는 56 78 12 34 |
출처 : 엔하위키- 엔디언
'프로그래밍 > C언어' 카테고리의 다른 글
[c언어] 삼항 연산자 (0) | 2015.04.08 |
---|---|
[c언어] 함수포인터 (0) | 2015.04.08 |
[c언어] __DATE__ , __TIME__ (0) | 2015.04.08 |