본문 바로가기
[ CODING STUDY ]/》C언어 코드실습

C언어 - [공용체, 열거형, 구조체비트필드]

by MRG 2021. 5. 17.
728x90
반응형

▣ 우선 공용체는 쉽게 이야기하면 메모리를 공용으로 사용하는 구조체라고 생각하시면 됩니다. 

union으로 구조체와 동일하게 선언해주시고, 안에 변수를 선언해주세요.

그리고 main함수에서 union Game game;으로 정의한 후에 

printf() 함수로 각각에 메모리 크기를 출력해보세요.

그럼 메모리 크기가 가장 큰 자료형 크기로 공용체가 정의되어 있음을 확인할 수 있습니다. 

 

▣ 같은 메모리를 사용하는지 값을 넣어서 확인해보겠습니다. 

char, short, int 형 중에 가장 큰 자료형인 int game.score에 값을 넣어보겠습니다. 

숫자 앞에 0x가 있으면 16진수입니다.

형식 지정자도 % x를 해야지 16진수로 출력되게 됩니다. 

 

▣ 출력해보면 나누어져 값이 들어가 있는 걸 확인할 수 있습니다. 

 

▣ 공용체에 대해 좀더 깊이 파보겠습니다. 

% p 형식으로 각각 주소를 출력하면 주소가 같은걸 확인할 수 있습니다.

 

▣ 그리고 중단점을 찍어서 디버그를 한 후에 메모리를 확인하고 1을 대입해서 

메모리에 접근해서 확인해보면 

이렇게 01이 대입되어 있는 걸 확인할 수 있습니다. 

 

▣ 또한 우리가 직접 *game 포인터로 malloc(sizeof(union Game))함수를 이용해서 

메모리를 직접 할당해서 사용할 수도 있습니다. 

 

▣ 이번에는 구조체비트필드입니다. 

구조체의 멤버인 자료형들은 각각에 메모리 크기만큼 사용합니다. 

구조체 비트 필드를 사용하면 구조체 멤버들 안에 있는 자료들을 비트 단위로 저장할 수 있습니다.

자료형보다 더 작은 비트 단위로 값을 가져오거나 저장하는 경우에 많이 사용합니다. 

 

▣ 구조체와 동일하게 만듭니다. 

그리고 안에 있는 unsigned 로 정의해줍니다. 양수로만 정의해서 사용합니다. 

그리고 int a : 7 콜론으로 각 몇 비트를 저장할지 지정해줍니다. 

 

▣ main함수에서 struct Data data로 정의해주시고

data.a에 정수형을 대입해주세요.

그리고 값을 각각 출력해보면 다른값들이 나옵니다. 

이건 우리가 지정해준 10진수에 값을 2진수로 바꿔서 

우리가 지정해준 비트만큼만 저장하기 때문입니다. 

 

▣ 이런식으로 10진수를 2진수로 2진수를 10진수로 계산할 수 있습니다. 

35는 2진수로 0100011 이기 때문에 a는 7비트를 저장해서 35가 나오게 됩니다. 

12는 2진시로 1100입니다. b는 2비트를 저장하기 때문에 00을 넣어서 값이 0이 됩니다. 

이런 식으로 내가 지정한 비트만큼 값을 저장하게 됩니다. 

 

▣ 열겨형은 간단합니다. 상수를 여러 개 관리하기 위한 구조체다라고 생각하시면 됩니다. 

enum Game으로 구조체와 동일하게 지정해주시고, 

안에 상수값을 정의해주세요.

그리고 main함수에 enum Game game;을 정의하고 출력하시면 바로 그 상수에 이름에 값만큼 값이 출력되는걸

확인할 수 있습니다. 

728x90
반응형

댓글