검색결과 리스트
글
기억 장소가 부족할 때에는 여러 대상체(object)를 하나의 기계어에 채워 넣을 필요가 있다.가장 많이 쓰이는 방법은 컴파일러의 심벌 테이블에서와 같이 각각 한 비트의 플래그를 두는 것이다. 하드웨어 장치에 대한 인터페이스 같은 외부적으로 주어진 데이터 형식은 한 단어를 여러족가으로 분리해서 처리할 수있는 능력을 요구한다.
컴파일러에서 심벌 테이블을 조사하는 경우를 생각해 보자. 프로그램에 있는 각 식별자(identifier,뱐수나 상수의 이름 함수의 이름등)는 그와 과련된 어떤 정보, 즉 그것이 키워드 인지 아닌지 또는 외부의 정적인 것인지 아닌지 등과 연관된 어떤 정보를 갖고 있다. 그러한 정보를 코드와 시키는 가장 간견한 방법은 하나의 나 1키느 짜리 플래그(flag)를 쓰는 것이다.
이를 하는 일반적인 방법은 각 연관된 비트의 위치에 적당한 역할을 부여하는 것이다.
#define KEYWORD 01
#define EXTERNAL 02
#define STATIC 04
또는
enum { KEYWORD = 01,EXTERNAL 02,STATIC = 04};
이때 숫자는 반드시 2의배수 또는 1이어야 한다 이렇게 하면 제 2장에서 설명한 시프트나 마스크 보수 연산자를 가지고 비트를 조작하는 것과 어떤 비트의 값을 알아내는 것이 가능해 진다.
다음과 같이 쓰면 플래그의 EXTERNAL과 STATIC 비트는 on 상태가 되고
flags |= EXTERNAL | STATIC;
이것을 다음과 같이 쓰면 off가 된다.
flags &= ~(EXTERNAL | STATIC);
그리고 다음과 같이 썽르 경우에는 EXTERNAL과 STATIC둘다 off일때만 참이 된다.
if ((flags & (EXTERNAL | STATIC)) == 0) ...
C에서는 이러한 비트단위 논리 연산자를 쓴느 방법 외에 단어의 필드를 직접 액세스 하고 정의하는 방법도 제공하다. 비트 필드의 줄임말인 필드는 워드라고 부르는 기억장소 내의 인접한 비트의 집합으로 이루어진다. 필드를 정의하고 액세스 하는 구문은 구조체에 근거를 두고있다. 예를 들어 앞에서 언급한 바 있는 심벌 테이블 #define은 다음과 같이 세개의 필드를 정의 해서 나타낼수 있다.
struct {
unsigned int is_keyword : 1;
unsigned int is_extern : 1;
unsigned int is_static : 1;
} flags;
이렇게 하면 flags는 세개의 1비트짜리 필드를 가진 변수로 정의 된다. 콜론 뒤의 숫자는 필드의 크리를 비트수로 표시한 것이다. 여기서 필드는 부호 없는 수임을 표시하기 위해 unsigned 라고 정의된다
각 필드는 구조체의 멤버와 마찬가지로 flags.is_keywoord,flags.is_extern등으로 사용된다 또한 필드는 다른 정수와 마찬가지로 수식에서도 쓰일 수이 ㅆ는 조그만 정수이다 따라서 위의 수식은 다음과 같이 쓰느 것이 더 자연스럽다 비트를 on 시키기 위해서는 다음과 같이 하고
flags.is_extern = flags.is_static = 1;
off 시키기 위해서는 다음과 같이 하며,
flags.is_extern = flags.is_static = 0;
그 비트를 시험하기 위해서는
if (flags.is_extern == 0 && flags.is_static == 0)
...
위와 같이 작성하고 쓰면 된다
필드는 int 의 경계를 넘으면 안된다 만약 그런 일이 생긴다면(중첩된다면)필드는 다음 int의 경계에 정돈된다
필드는 이름이 없어도 된다. 기억장소의 시작위치를 맞추기 위해 콜론과 크기만 있는 이름없는 필드가 사용되기도 한다. 특수하게 크기가 0인 필드가 있는데 이것은 int의 경계와 맞추기위해 사용된다
필드의 사용에는 여러가지 주의할 점이 있는데 가장 중요한 것은 외쪽에서 오른쪽으로 지정된 기종도 있고 오른쪽에서 왼쪽으로 지정된 기종도 있다는 점이다 이것은 필드가 내부저ㅗㄱ으로 정의된 자료구조를 유지 하는데 매우 유용하지만 외부적으로 정의된 자료를 분해할때는 어느쪽 끝이 먼저인가를 고려해야 함을 의미한다. 그러한 것에 관련된 프로그램은 다른기종에 옮기기가 힘들다(호환성이 없다).필드는 단시 int만으로도 정의될수 있자만 호환성을 유지하기 위해서 signed인지 unsigned인지 명확히 구별할 필요가 있다. 그것들은 배열될 수 없으며,주소도 갖지 않기 때문에 그들에 대해서 &연산자도 적용될 수없다
'프로그래밍 > C' 카테고리의 다른 글
7.2 형식회된 출력: printf(Formatted Output - printf) (0) | 2014.11.08 |
---|---|
7.1 표준 입력과 출력(Input and Output) (0) | 2014.11.08 |
6.8 유니온(Unions) (0) | 2014.11.08 |
6.7 형 정의(Typedef) (0) | 2014.11.08 |
6.6 테이블 조사(Table Lookup) (0) | 2014.11.08 |
RECENT COMMENT