2023. 9. 11. 23:46ㆍ컴퓨터/컴퓨터 구조
[목차]
1. 자료형 크기 확인 [1]
2. 오버플로우 재현 [1]
3. 비트연산 c언어 프로그램 작성 [1]
4. 특정 위치의 비트를 끄는 코드 만들기[1]
5. GCC Compiler [2]
6. GDB Debuger를 이용한 디버깅 [1] [2]
데이터 표현 실습
- 자료형 크기 확인 (sizeof)
각각의 자료형의 크기를 알아보았다. MSDN, cplusplus를 통해서도 자료크기를 확인할 수 있다.
- 오버플로우 재현
Char형은 -127~126, 256개의 숫자가 표현 가능하다. CHAR_MAX보다 1큰수를 출력하였더니 오플러우 되어 -128의 값이 나왔다.
다음으로는 리눅스 커널에서 해당 파일을 실행했을 때 각각의 명령어에서 나오는 결과값을 적어보았다.
Gdb란? GNU에서 나온 디버깅 프로그램이다. GDB는 컴퓨터 프로그램의 실행을 추적하고 변경하기 위한 광범위한 기능을 제공한다. 사용자는 프로그램의 내부 변수 값을 모니터링하고 수정할 수 있으며, 프로그램의 정상적인 동작과 독립적으로 함수를 호출할 수도 있다 -wikipedia(GNU Debugger) |
gcc -o main main.c -g (gdb) b main (gdb) r (gdb) n (gdb) p/t value (gdb) p value |
디버깅 옵션인 -g로 컴파일 중단점(breakpoint) 사용하기 프로그램 수행 현재 행을 수행하고 멈추지만, 함수의 경우 함수를 수행하고 넘어감 출력 형식의 지정(p/t value: value값을 이진수(t)로 출력) 변수값(value)를 출력 |
- 비트연산 C언어 프로그램 작성해서 확인하기
#include <stdio.h>
//특정 위치에 비트 값이 1인지 확인하는 함수
int is_bit_set(unsigned char value, int position) {
return (value & (1 <<position)) != 0;
}
unsigned char set_bit(unsigned char value, int position) {
return value | (1<<position);
}
int main() {
//unsigned 양수만 표시 가능 0~255
unsigned char value = 0b00001000; //gcc extension
//3번째 비트가 설정되어 있는지 확인
if(is_bit_set(value, 3)) {
printf("3rd bit is set!\n");
} else {
printf("3rd bit is not set!");
}
//2번째 비트를 설정
value = set_bit(value, 2);
printf("Value after setting 2nd bit: %d\n", value);
return 0;
}
main 함수에서 is_bit_set 함수와 set_bit 함수를 사용한다.
1. is_bit_set 함수는 특정 포지션에 비트가 들어있는지 확인하는 함수이다.
1<<position이 0000 0001 비트를 position 숫자만큼 shift하고 남은 자리는 모두 0이기 때문에
(예시. position=3, (1<<position) --> '0000 1000')
& 연산자를 사용할 경우 position 자리에 1이 존재하지 않는 경우 0000 0000으로 return 값이 0이 된다.
2. set_bit 함수는 postion잘에 bit를 추가하는 함수다.
위와 같이 (1<<postion)값을 value값과 |(or)연산자로 계산할 경우 position 자리에 1이 있을 수 밖에 없다.
- 특정 위치의 비트를 끄는 함수 만들기
#include <stdio.h>
unsigned char clear_bit(unsigned char value, int position) {
return value & ~(1<<position);
}
int main() {
//unsigned 양수만 표시 가능 0~255
unsigned char value = 0b01010101; //gcc extension
value = clear_bit(value, 2);
printf("Value after clearing: %d", value);
}
특정 위치에서 비트를 끄는 프로그램을 코딩을 해 보자
01010101에서 3번쨰 1을 지워 01010001로 만들고자 한다.
해당 프로그램은 아래 순서로 진행된다.
1. 1(0000 0001)을 비트를 지울 위치만큼 shift시킨다. (ex. position = 2, 0000 0001 --> 0000 0100)
2. shift시킨 비트를 ~(NOT)연산자를 통해 해당 position을 제외한 부분을 1로 만들어준다.
(ex. 0000 0100 --> 1111 1011)
3. value값과 &연산자를 통해 계산하면 position 부분은 0으로 바뀌고 다른 위치의 비트 값은 본래 value의 값과 같아진다.
(ex. 0101 0101 & 1111 0111 --> 0101 0001
'컴퓨터 > 컴퓨터 구조' 카테고리의 다른 글
컴퓨터 구조 실습[2] (0) | 2023.09.12 |
---|