[C] 저수준 프로그래밍

Chris Kim·2024년 10월 28일

프로그래밍언어

목록 보기
17/25

1. 비트 연산자

C는 비트 연산자를 통해 정수형 자료를 비트 단위로 다룰 수 있다. 다른 4개의 비트 연산자의 기초가 되는 두 시프트 연산자가 있다.

시프트 연산자

>>는 좌측 시프트, <<는 우측 시프트 연산자다. 정수형 자료형이 피연산자가 될 수 있다. 두 연산자 모두에서 정수 승격이 발생할 수 있다. i<<j 는 i의 비트들을 j비트만큼 왼쪽으로 옮기는 것을 말한다. i>>j는 반대다. 만약 i가 무부호 혹은 양수라면 0이 붙겠지만 그렇지 않은 경우, 구현 정의에 따른다: 0이 올 수도, 1이 올 수도 있다.

주의: 비트 연산자는 다른 산술 연산자보다 우선순위가 낮다.

비트 논리 연산자

~는 비트 반전, &|는 and와 or를 ^는 xor를 의미한다.

주의: &&, ||와 헷갈리면 안된다. 이 둘은 논리 연산자다.

비트연산자 활용

비트 설정

i = 0x0000; /* i is now 0000000000000000 */
i |= 0x0010; /* i is now 0000000000010000 */

비트 clear

i = 0x00ff; /* i is now 0000000011111111 */
i &= -0x0010; /* i is now 0000000011101111 */
i &= ~ (1 << j ) ; /* clears bit j */

비트 검사

if (i & 0x0010)
if (i & 1 << j)

비트-필드 접근

연속적인 비트로 이뤄진 그룹을 다루는 것은 단일 비트를 다루는 것 보다 더 복잡하다. 대표적인 두 예시를 소개하겠다.

비트 필드 변경
비트필드를 변경하기 위해선, 비트 논리연산자 &를 쓴 뒤, 비트 논리연산자 |를 사용해야한다.

i = i & -0x0070 | 0x0050;	/* stores 101 in bits 4-6 */
i = (i & -0x0070) | (j << 4);

비트 필드 검색

j = i & 0x0007;
j = (i >> 4) & 0x0007;

2. 구조체 비트필드

비트필드를 구조체에 적용해서 활용할 수 있다.
연도/월/일을 나타내는 구조체를 다음과 같이 나타낼 수 있다.

3. 기타 테크닉

기기 의존 형 정의

char 형은 정의에 따라 1 바이트를 차지한다. 우리는 종종 문자를 바이트로 다루고 데이터를 저장하기 위해 사용하기도 한다. 이 때 반드시 문자 형태일 필요는 없다. 그럴때, BYTE형을 정의하는 것은 유용하다.

typedef unsigned char BYTE;

Data를 여러가지 방법으로 다루기 위한 공용체 사용

공용체는 여러 방식으로 사용되며, 공용체들은 C에서 서로 완전히 다른 목적을 가지기도 한다. 같은 값이더라도 다른 자료형으로 읽거나 쓰고 싶을 수 있다. 그럴때 공용체를 사용하면 된다.

union int_date {
unsigned short i;
struct file_date fd;
};

volatile 형식 지정자

몇몇 컴퓨터에서는 특정 메모리 위치가 휘발성을 가질 때가 있다. 해당 위치에 저장된 값은 프로그램 실행 중에 변경되기도 한다. 심지어 프로그램은 새로운 값을 그곳에 저장하지 않는데도 말이다. 예를 들어 몇몇 메모리 위치는 입력 장치로부터 직접적으로 전달된 데이터를 저장한다.
volatile 형식 지정자는 컴파일러에게 어떤 데이터가 휘발성을 가지고 있는지 여부를 전달한다. 전형적으로, volatile은 포인터 변수를 선언할 때 등장하며, 이 포인터 변수는 휘발성 메모리 위치를 가리킨다.

volatile BYTE *P;
profile
회계+IT=???

0개의 댓글