C언어

각종 정리 -1

twoweeks-within 2024. 11. 8. 02:52

크로스컴파일

(A)cpu > 운영체제(리눅스) > gcc ( program1 ,p2, p3 ..)

(B) cpu > 임베디드 (Arm) > 전용 컴파일러필요, 자체실행불가( 시계 같은것)

>> 크로스컴파일러의 등장

A-gcc(A cpu에서 동작) > 내가만든 c코드>> B cpu에서 동작하는 기계어로 번역 = A cpu 운영체제에서는 동작 x

 ex) apt-get install gcc-arm-linux-gneabi

리눅스에서 동작하는 gcc 이긴 하지만 결과물: arm용

크로스컴파일에는 gdb 디버거만 제공

 

gdb 명령어

gcc -g program.c

gdb a.out

run , l

b 15 // 15번째줄에 breakpoint

 

소스코드 저장 과정

하드디스크 > a.out  저장, 실행하면 > 메모리로 옮김

메모리 내부에는 (코드영역((ex)상수) ,데이터 영역(const), 영역, 스택영역)

 

변수명 규칙

  1.  숫자로 시작 X :  c언어를쭉 한번 읽음 > 앞에 숫자로 시작하면 > 그냥 무조건 상수로 생각해버림
  2. 키워드는 불가능.(if,switch,for,,)
  3. ‘-‘ 불가 , 연산자(뺄셈)이라서

sizeof 사용

시스템에 따라 Int,char,shot, long 크기 달라짐

> 임베디드 시스템에서 크기 보거나, 배열크기 확인

 

const

const int a=3;  >> a 더이상 변경 불가능

 

a++ , ++a, a- -, --a

int a=1;

a++ (후연산자) > 다음줄에 반영 printf(“%d\n”,a++): 1을 출력하고 2를 저장

++a>> 플러스를 한뒤에 a를 보여줘 prinf(“%d\n”,++a) : 저장된2+1=3 출력

a-- 3을 출력한뒤 1을 뺀것을 저장 : 3출력 2저장

--a 하나 뺀것을 출력: 2-1=1 출력

 

산술: + - / * %

논리 : II(or) &&(and) > < >= <= ==

 맞으면 1  // (c언어) 0이 아니면 전부 다 맞음 1)

 아니면 0 // (틀리다는 0)

 c= a=3 ll b=5     >> 맞는거(3) ll(or) 맞는거(5) = 맞는거 >1

 *c언어에서 논리연산 결과가 맞으면 1 , 틀리면 0

 d = a II b 에서 a만 맞기만 하면 b 보지도 않고 참으로 함

 a= a&& c 에서 a 가 틀리기만 해도 c는 보지도 않고 거짓

 ex) if(isRunning()&& isHot()){

            turnoffHeater();
       }

 에서 isRunning이 0을 보내면 isHot은 실행조차 안하고 if문 실행 X

<> OR연산에서는 isRunning 0이 아닌값 이기만 하면 if문 실행 

>> && 연산에서 isHot이 한번 실행은 될줄 알고 카운트 계산해서 코딩했는데

isRunning이 0이 나와 isHot 실행 X >> 의도 하지 않은 버그 >> 잡기 힘든 버그 생김

 d = a(3)<b(5)  ㅡㅡ 맞으므로 d=1

비트 연산자

 l (비트 or) &(비트 and) ~ (비트 not) << >>  (비트 시프트)   

  >레지스터 값을 수정 ,데이터시트에서 사용

char a=8; 0000 1000 // char 1byte

char b=4; 0000 0100

char c=0; 0000 0000

 a|b  = =      0000 1100

 

d= a&b == 0

0000 1000 & 0000 0100 == 0000 0000

 

쉬프트 연산

char a=24;

b= a<<1;  // 1들이 한칸씩 왼쪽으로 밀려남 == *2

c= a>>1; // 1들이 한칸씩 오른쪽으로 밀려남 == /2

a= 0001 1000 = 24

b= 0011 0000 =  48

c= 0000 1100 =12

bit연산이 cpu연산 속도가 훠어얼씬 빠름 (최적화)

> 숫자 :(숫자를 받아서 비트를 바꿔서 계산 하기때문) 랑 비트랑 연산 과정이 다름

 

삼항연산자(if문 대신) ?

조건 ? a : b; 

=> 조건 ? true faluse  // 조건이 참이면 앞에것이 실행, 거짓이면 뒤에것이 실행 (0이아니면 다 참(마이너스도 포함))

ex) (a=3>b=1) printf("3") : printf("1"); //   출력: 3

 

대입연산자  =    

  >오른쪽에서 왼쪽으로 들어가는 형태 // a=b , b값이 a에 들어감

 

비트 연산자 추가내용

bit on!

{// (arm에서는 a라는 한 주소 공간안에 32bit 가있음) 인데 편의를 위해 1byte라 하면

a= 0x30 = 48 (10) , 0011 0000

aㅣ= (1<<3); == a=*a l (1<<3); // a= a+3; == a+= 3;  , 4번 전구를 킨다. 에서 (1<<3) = 0000 1000 // 비트 전체적으로 밀림

둘을 or bit연산 ( l ) 하면

0011 1000 이됨.

a의 값은 건들이지 않고 4번 bit만 딱 on 할 수 있음.}

bit off!

3번 전구를 끄려면..

a= 21; // 0001 0101 에서 

off 하려면 1111 1011 해야함. > 끄고 싶은것만 0 을 하면 and 연산시 끌 수 있음. 기존의 것은 1으로 유지 , 원래 0이던것은 0 유지

1111 1011 을 하려면.. 1을 2번 왼쪽으로 보내고 반전 시킴

>> a =  a & (~(1<<2))

 == 0001 0001 = 17

 

>>>> 1bit gpio 하나를 물린다. 1 이면 high, 0 이면 low , 그때 비트 연산자로 제어 

  

 

'C언어' 카테고리의 다른 글

정리 - 2 -  (0) 2024.11.11
[c] 채팅프로그램  (0) 2024.11.07
makefile (script language)  (1) 2024.11.07
[c] 헤더파일, 문자열입력  (0) 2024.11.07