1. 구름 IDE로 리눅스 개발 환경 구성
1-1. 구름 IDE 서비스 회원가입 및 로그인
구름 IDE에 접속해 먼저 회원가입 및 로그인을 진행했다.

1-2. 컨테이너 생성
컨테이너 생성을 위해 기본 템플릿 및 C/C++을 스택으로 설정했다.

추가 도구 항목에서는 VSC를 체크했다.

위의 설정대로 컨테이너를 생성했으며, 잘 실행하는 것을 확인할 수 있었다.


2. Sizeof 연산 코드 작성
2-1. 소스 코드 작성
char, short, float 등 다양한 자료형의 사이즈를 출력하는 코드를 작성했다.
이때 '%zu'는 sizeof 연산의 출력을 위한 형식 문자이다.

2-2. 실행 결과

3. 오버플로 예제를 언더플로로 변경
3-1. 소스 코드 작성
<limits.h>는 정수형 자료형의 유효 범위를 확인할 수 있는 헤더다.
해당 헤더에 정의된 CHAR_MIN은 char 자료형의 최솟값을 나타내는 상수이다.
아래는 CHAR_MIN에서 1을 뺌으로써 최솟값보다 더 작은 연산 결과가
컴퓨터에서 어떤 결과를 초래하는지 확인하는 코드이다.

3-2. 실행 결과
char 자료형은 -128~127의 값을 수용하므로 최솟값이 -128인 것을 확인할 수 있었다.
논리적으로 -128에서 1을 빼면 -129가 되어야 하지만,
컴퓨터에선 언더플로가 일어나 127이 된 결과를 볼 수 있다.

4. 비트 연산 프로그램 작성
4-1. 소스 코드 작성
특정 위치의 비트를 끌 수 있는 clear_bit 함수를 아래와 같이 구현했다.

사용자에게 조작할 비트 위치에 대해 입력을 받도록 구현했다.

비트 내부 동작을 이해하기 쉽도록,
8비트의 이진수를 출력하는 함수도 추가했다.

아래는 전체 코드이다.
#include <stdio.h>
unsigned char clear_bit(unsigned char value, int position){
return value & ~(1<<position);
}
void print_bits(unsigned char value){
printf("(");
for (int i=0;i<8;i++){
printf("%d", (value&(0x80>>i)) >> (7-i));
}
printf(")\n");
}
int main() {
unsigned char value = 0b11111111;
int input;
printf("몇 번째 위치의 비트를 끌지 입력해주세요. (0번째부터 시작) -> ");
scanf("%d", &input);
value = clear_bit(value, input);
printf("%d번째 비트를 끈 값: %d ", input, value);
print_bits(value); // 비트 단위로 출력하는 함수
return 0;
}
4-2. 결과 출력
대상이 되는 값은 255(이진수로 11111111)로 설정했으며, 아래는 0번째 비트를 껐을 때의 결과이다.

아래는 3번째 비트를 껐을 때의 결과이다.

마지막으로, 아래는 7번째 비트를 껐을 때 결과이다.

5. C언어의 기계어 변환 과정
아래의 간단한 C언어 소스 코드가 실행 파일이 될 때까지의 변환 과정을 관찰했다.

5-1. 전처리
아래는 소스 코드를 전처리하는 명령어다.
gcc -E main.c -o main.i
명령어 실행 후, '.i'의 확장자를 가진 파일이 생성된 것을 볼 수 있다.

main.i의 내부 모습은 다음과 같았다.

5-2. 컴파일
아래는 전처리된 소스 코드를 어셈블리어로 컴파일하는 명령어다.
gcc -S main.i -o main.s
명령어 실행 후, '.s'의 확장자를 가진 파일이 생성된 것을 볼 수 있다.

main.s의 내부 모습은 다음과 같았다.

5-3. 어셈블리
아래는 어셈블리어 파일을 오브젝트 파일로 변환하는 명령어다.
gcc -c main.s -o main.o
명령어 실행 후, '.o'의 확장자를 가진 파일이 생성된 것을 볼 수 있다.

main.o의 내부 모습은 다음과 같았다.
기계어로 변환이 되었기 때문에, 사람이 읽을 수 없는 형태임을 확인할 수 있었다.

5-4. 링킹
아래는 실행 파일을 생성하는 명령어다.
gcc main.o -o main
명령어 실행 후, main이라는 실행 파일이 생성된 걸 볼 수 있었다.

마침내 실행 파일이 되어 소스 코드가 동작하는 것을 확인할 수 있었다.

1. 구름 IDE로 리눅스 개발 환경 구성
1-1. 구름 IDE 서비스 회원가입 및 로그인
구름 IDE에 접속해 먼저 회원가입 및 로그인을 진행했다.

1-2. 컨테이너 생성
컨테이너 생성을 위해 기본 템플릿 및 C/C++을 스택으로 설정했다.

추가 도구 항목에서는 VSC를 체크했다.

위의 설정대로 컨테이너를 생성했으며, 잘 실행하는 것을 확인할 수 있었다.


2. Sizeof 연산 코드 작성
2-1. 소스 코드 작성
char, short, float 등 다양한 자료형의 사이즈를 출력하는 코드를 작성했다.
이때 '%zu'는 sizeof 연산의 출력을 위한 형식 문자이다.

2-2. 실행 결과

3. 오버플로 예제를 언더플로로 변경
3-1. 소스 코드 작성
<limits.h>는 정수형 자료형의 유효 범위를 확인할 수 있는 헤더다.
해당 헤더에 정의된 CHAR_MIN은 char 자료형의 최솟값을 나타내는 상수이다.
아래는 CHAR_MIN에서 1을 뺌으로써 최솟값보다 더 작은 연산 결과가
컴퓨터에서 어떤 결과를 초래하는지 확인하는 코드이다.

3-2. 실행 결과
char 자료형은 -128~127의 값을 수용하므로 최솟값이 -128인 것을 확인할 수 있었다.
논리적으로 -128에서 1을 빼면 -129가 되어야 하지만,
컴퓨터에선 언더플로가 일어나 127이 된 결과를 볼 수 있다.

4. 비트 연산 프로그램 작성
4-1. 소스 코드 작성
특정 위치의 비트를 끌 수 있는 clear_bit 함수를 아래와 같이 구현했다.

사용자에게 조작할 비트 위치에 대해 입력을 받도록 구현했다.

비트 내부 동작을 이해하기 쉽도록,
8비트의 이진수를 출력하는 함수도 추가했다.

아래는 전체 코드이다.
#include <stdio.h>
unsigned char clear_bit(unsigned char value, int position){
return value & ~(1<<position);
}
void print_bits(unsigned char value){
printf("(");
for (int i=0;i<8;i++){
printf("%d", (value&(0x80>>i)) >> (7-i));
}
printf(")\n");
}
int main() {
unsigned char value = 0b11111111;
int input;
printf("몇 번째 위치의 비트를 끌지 입력해주세요. (0번째부터 시작) -> ");
scanf("%d", &input);
value = clear_bit(value, input);
printf("%d번째 비트를 끈 값: %d ", input, value);
print_bits(value); // 비트 단위로 출력하는 함수
return 0;
}
4-2. 결과 출력
대상이 되는 값은 255(이진수로 11111111)로 설정했으며, 아래는 0번째 비트를 껐을 때의 결과이다.

아래는 3번째 비트를 껐을 때의 결과이다.

마지막으로, 아래는 7번째 비트를 껐을 때 결과이다.

5. C언어의 기계어 변환 과정
아래의 간단한 C언어 소스 코드가 실행 파일이 될 때까지의 변환 과정을 관찰했다.

5-1. 전처리
아래는 소스 코드를 전처리하는 명령어다.
gcc -E main.c -o main.i
명령어 실행 후, '.i'의 확장자를 가진 파일이 생성된 것을 볼 수 있다.

main.i의 내부 모습은 다음과 같았다.

5-2. 컴파일
아래는 전처리된 소스 코드를 어셈블리어로 컴파일하는 명령어다.
gcc -S main.i -o main.s
명령어 실행 후, '.s'의 확장자를 가진 파일이 생성된 것을 볼 수 있다.

main.s의 내부 모습은 다음과 같았다.

5-3. 어셈블리
아래는 어셈블리어 파일을 오브젝트 파일로 변환하는 명령어다.
gcc -c main.s -o main.o
명령어 실행 후, '.o'의 확장자를 가진 파일이 생성된 것을 볼 수 있다.

main.o의 내부 모습은 다음과 같았다.
기계어로 변환이 되었기 때문에, 사람이 읽을 수 없는 형태임을 확인할 수 있었다.

5-4. 링킹
아래는 실행 파일을 생성하는 명령어다.
gcc main.o -o main
명령어 실행 후, main이라는 실행 파일이 생성된 걸 볼 수 있었다.

마침내 실행 파일이 되어 소스 코드가 동작하는 것을 확인할 수 있었다.
