C언어 & C++
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
컴퓨터 구조
- CPU가 Memory(RAM)에서 명령어 호출 (Fetch)
- CPU가 명령어 해독 (Decoding)
- 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
* 와 &
메모리
(낮은 주소)
*코드 영역 <- 실행할 프로그램의 코드
*데이터 영역 <- 전역변수, 정적(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