4 분 소요

Hits

8bit = 1byte

8bit : 256개 명령어 (표현할 수 있는 값의 범위 : 0 ~ 255) (부호가 있을 때는 -256 ~ 255)
16bit : 65536개 명령어 (표현할 수 있는 값의 범위 : 0 ~ 65536) (부호가 있을 때는 -65537 ~ 65536)
32bit : 약 42억… (표현할 수 있는 값의 범위 : 0 ~ 약 42억…)

GCC : GNU Compiler Collection

sudo apt install gcc # gcc 설치
gcc main.c # 메인C파일 컴파일 하면 a.out 파일이 생김
./a.out # 실행하면 결과 보임

C언어 컴파일 방법

gcc main.c -o 컴파일_파일명 # 예시 : gcc main.c -o ex_02

C++ 컴파일 방법

g++ main.cpp -o 컴파일_파일명 # 예시 : g++ main.cpp -o ex_02

* 아스테리스크(asterisk)

“모든 것”을 의미
터미널에서 유용하게 사용 가능

상수 종류

정수 : 4byte = 32bit
실수 : 8byte = 64bit
문자 : 4byte = 32bit

부호비트

0이면 양수, 1이면 음수

보수

2의 보수 : 1의 보수를 만들어서 + 1을 한다. (컴퓨터가 음수를 저장하기 위해 사용하는 방법 중 하나)
0000 0001 에서 1의 보수 => 1111 1110
1111 1110 에서 +1을 해서 2의 보수 => 1111 1111

2진수 계산

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10

엔디안

엔디안 : 데이터에 여러 바이트가 있는 경우 바이트 순서를 정하는 규칙
빅엔디안 방식 : 메모리의 앞번지에 큰 숫자 저장할 때
리틀엔디안 방식 : 메모리의 앞번지에 작은 숫자 저장할 때 // 캐스팅(형변환)하기 편하다 (ex. ARM, 인텔)

변수 : 저장 공간

float는 4byte 실수를 넣어줌
double은 8byte 실수를 넣어줌
char의 저장공간은 1byte

컴퓨터 구조

  1. CPU가 Memory(RAM)에서 명령어 호출 (Fetch)
  2. CPU가 명령어 해독 (Decoding)
  3. CPU가 명령어 실행 (Excute)

어셈블리어(assembly language)

기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어. 이식성은 없음.

로드와 스토어

load (로드) : 메모리에서 레지스터로 전송
store (스토어) : 레지스터에서 메모리로 전송

CPU

CPU : Central Processing Unit 중앙처리장치
MCU : Micro Controller Unit 소형제어칩 (종류 : ATmel 의 AVR, 삼성의 엑시노스, 퀄컴의 스냅드래곤)
MPU : Micro Processing Unit 소형처리칩 (MP : ARM Core)

커널(Kernel)

운영체제의 핵심이라 할 수 있는 매우 중요한 소프트웨어로
하드웨어의 자원을 자원이 필요한 프로세스에 나눠주고,
덩달아 프로세스 제어(작업 관리), 메모리 제어, 프로그램이 운영 체제에 요구하는 시스템 콜 등을 수행하는 부분이며
운영 체제의 가장 아래 계층에서 돌아간다.

배열에서는 배열명 자체가 주소다.

char grade;
char name[20];
scanf("%c", &grade); // 문자인 변수명 지정할 때 &를 붙여야 한다. 
scanf("%s", name); // name 배열에 이름 문자열 입력, &를 사용하지 않는다. 

char name[20] 에서 배열의 크기가 20바이트이므로 최대 19자의 문자열을 입력할 수 있다.
나머지 하나는 null이 들어가야 하기 때문.

빌드 관련된 거 다 설치

sudo apt install build-essential

vscode 에서 c파일 빌드 방법

터미널 > 작업실행 > cppbuild > C/C++:gcc 활성 파일 빌드
터미널 > 기본 빌드 작업 구성 > C/C++:gcc 활성 파일 빌드 <- 로 설정하면 .vscode 폴더가 생기고, tasks.json 파일이 생긴다.
따라서 Shift + Ctrl + B 누르면 빌드 된다.

디버깅 없이 실행 : Ctrl + F5

비트 연산자

& : 두 비트가 모두 1인 경우에만 1로 계산  
^ : 두 비트가 서로 다른 경우만 1로 계산  
| : 두 비트 중에서 하나라도 참이면 1로 계산  
~ : 1을 0으로 바꾸고, 0을 1로 바꿈  
<< : 비트를 왼쪽으로 이동  
>> : 비트를 오른쪽으로 이동  

vscode 자동 정렬

Ctrl + K + F

sizeof를 이용한 요소의 개수

int cnt = sizeof(score) / sizeof(score[0]); 

배열

char str[80] = "applejam"; // 배열명은 배열의 0번요소의 주소이다. (저것의 배열명은 str임)

printf("sizeof = %lu\n", sizeof("applejam")); // 맨뒤에 널값(\0)을 넣어줘서 9
printf("sizeof = %lu\n", sizeof(str)); // 배열의 전체 사이즈 보여줘서 80

포인터

int a;
int *pa; // *는 포인터임. pa는 포인터 변수임(주소값을 저장)

pa = &a; // &은 주소연산자
*pa = 10; // *는 간접참조연산자. a에 10을 넣어준 것과 같다.

printf("%u\n", &a); // 4294958572
printf("%u\n", a); // 10
printf("%u\n", &pa); // 4294958576
printf("%u\n", pa); // 4294958572
printf("%u\n", *pa); // 10

* 와 &

pointer

메모리

(낮은 주소)
*코드 영역 <- 실행할 프로그램의 코드
*데이터 영역 <- 전역변수, 정적(static) 변수, 상수
*힙 영역(런 타임에 크기가 결정됨) <- 사용자의 동적 할당
*스택 영역(컴파일 타임에 크기가 결정됨) <- 지역변수, 매개변수
(높은 주소)

배열의 0번째에 대하여

ary[0] 은 요소라고 하고, 안에 숫자는 인덱스
ary = ary[0] 배열명은 배열의 시작 주소

C++ 값에 의한 호출

기본생성자는 호출하지 않지만, 소멸자는 호출함. (비대칭구조)
복사생성자는 호출됨.

전처리

gcc -S main.c -o main.s // 어셈블리어 코드
gcc -E main.c -o main.i // -E를 붙이면 : 전처리가 된 파일

전처리 : 컴파일을 하기 전에 처리. 컴파일 하기 전에 바꿔주는 것.

전처리가 끝나면 인클루드한 파일의 내용은 복사되어 소스 파일에 포함된다.

C언어 오브젝트 파일 만드는 법

gcc -c main.c // 이렇게 하면 리눅스에서는 main.o 라고 나오고, 윈도우에서는 main.obj 라고 나온다
gcc -c sub.c

C++ 오브젝트 파일 만드는 법

g++ -c sub.cpp
g++ -c main.cpp

C언어 링크 하는 법

gcc main.o sub.o -o app

C++ 링크 하는 법

g++ main.o sub.o -o app

C언어 Makefile 만들기

Makefile 만들어서 아래와 같이 쓴다. 그리고 터미널에서 make 라고 친다.

app : main.o sub.o
	gcc main.o sub.o -o app
main.o : main.c
	gcc -c main.c -o main.o
sub.o : sub.c
	gcc -c sub.c -o sub.o
clean:
	rm -rf *.o

클린 시키고 싶으면 make clean 이라고 친다.

C++ Makefile 만들기

Makefile 만들어서 아래와 같이 쓴다. 그리고 터미널에서 make 라고 친다.

app : main.o sub.o
	g++ main.o sub.o -o app
main.o : main.cpp
	g++ -c main.cpp -o main.o
sub.o : sub.cpp
	g++ -c sub.cpp -o sub.o
clean:
	rm -rf *.o

CMakeLists.txt 사용법

CMakeLists.txt 에 작성

#CMakeLists.txt
cmake_minimum_required(VERSION 3.22)

# 프로젝트 이름
project(EX19_9)

# 실행 파일 추가
add_executable(app average.c input.c main.c)
sudo apt install cmake
mkdir build
cd build
cmake .. // 이라고 친다. 왜냐면 현재 build에 들어와 있는데 CMakeLists.txt는 상위 폴더에 있으니까
make // 라고 치면 build 폴더 안에 Makefile 이 만들어진다.
make clean // 라고 치면 app 이랑 *.o 파일 등이 지워진다.

태그:

카테고리:

업데이트:

Comments