본문 바로가기
# Semiconductor/- Semicon Academy

[Harman 세미콘 아카데미] 11일차 - 반도체 개요, C언어 개요 및 문법

by Graffitio 2023. 7. 3.
[Harman 세미콘 아카데미] 11일차 - 반도체 개요, C언어 개요 및 문법
728x90
반응형
[반도체 개요]

   

반도체란?

https://rangvest.tistory.com/entry/%EB%B0%98%EB%8F%84%EC%B2%B4%EB%9E%80-%EB%B0%98%EB%8F%84%EC%B2%B4%EC%9D%98-%EC%A0%95%EC%9D%98-%EB%B0%8F-%ED%8A%B9%EC%A7%95-%EC%86%8C%EC%9E%90-%EB%B0%98%EB%8F%84%EC%B2%B4-%EC%A2%85%EB%A5%98

 

[반도체란?] - 반도체의 정의 및 특징, 소자, 반도체 종류

[반도체] 반도체란? [Semiconductor] : 전기가 잘 통하는 도체와 통하지 않는 부도체(절연체)의 중간 특성을 가진 물질 그 물질 자체보다 반도체 소자를 의미하는 경우가 많다. 반도체의 특징 : 열, 빛,

rangvest.tistory.com

 

    반도체 8대 공정

https://rangvest.tistory.com/entry/%EB%B0%98%EB%8F%84%EC%B2%B4-8%EB%8C%80-%EA%B3%B5%EC%A0%95-%EC%A0%95%EB%A6%AC

 

반도체 8대 공정 정리

1. 웨이퍼 공정 ① 잉곳 만들기 모래에서 추출한 Si를 고온의 열로 녹여 고순도의 Si 용액으로 만들어 굳혀 잉곳 생성 ② 잉곳 절단 얇은 웨이퍼를 만들기 위해 다이아몬드 톱으로 잉곳을 균일한

rangvest.tistory.com

 

[C언어 개요]

 

프로그래밍 언어

    ▶Low쪽으로 갈 수록 컴퓨터가, High쪽으로 갈 수록 인간이 알기 쉽다.

 

1) Low level

    - 기계어 : 2진 cpu 명령어

    - 어셈블리어 : 기계어와 1:1로 대응되는 니모닉 기호

       cf) 니모닉 기호 : 사람이 알아보기 쉬운 문자로 된 기호

 

2) High level

    - C, C++, Java, Python

    - CPU 종류나 하드웨어의 특성에 얽매이지 않는 프로그램을 작성

    - C++ : c언어+객체지향프로그래밍+제네릭프로그래밍

 

C언어란?

- 원하는 결과를 얻어내기 위한 프로그램 작성 시, 필요한 일종의 언어

- 유닉스 운영 체제하에서 시스템 프로그래밍을 위해 개발된 언어

- 구조적이며 강력한 기능 및 빠른 속도를 가진다.

- 절차 지향 프로그래밍 언어이므로, 작성한 순서대로 작동한다.

 

C 프로그램 개발 과정

 

1) 소스 파일 작성

2) 컴파일

     : 소스 파일을 기계어 파일로 만드는 과정

     < 전처리기 → 구문분석 → 코드생성 → 링크 >

     ① 전처리기 : 소스파일을 컴파일하기위한 준비

     ② 구문분석 : 소스가 문법에 맞는지 검사(컴파일에러 체크)

     ③ 코드생성 : 각 소스마다 별개의 오브젝트 코드 생성

     ④ 링크 : 여러 개의 오브젝트 파일과 라이브러리, 시동 코드 등을 

                    하나로 합쳐 실행파일 생성(문제 발생 시, 링크에러 생성)

3) 실행

    - 링크 결과 생성된 실행 파일을 실행하여 올바른 결과를

       얻을 수 있는 지 체크(문제 발생 시, 실행 에러 생성)

    - 디버깅

       : 프로그램 실행 흐름이 올바르게 진행되는지 등을

         확인하고 에러를 고치는 과정.

 

[Visual studio setting]

 

1. 프로젝트 생성

초기 시작 화면
C++, Windows, 콘솔 선택
프로젝트명과 경로 설정

 

2. 소스 파일 생성

확장자를 꼭 cpp &rarr; c로 바꿔줘야 한다.

 

3. 기본 세팅

background 설정
글꼴 설정 : Cascadia_Code 글꼴 추천

 

[C언어 문법]

 

1. 기본 요소 및 구조

#include <stdio.h> 

int main() {
	printf("Hello world ! \n"); // C언어의 국룰

	return 0;
}

 

<기본 요소>

 

1) #include <stdio.h>

: stdio는 standard input/output의 약자로, 표준 입출력 헤더 파일 모음을 의미

 

stdio 우클릭하고 문서로 이동 클릭
stdio에 대한 각종 규정들을 볼 수 있다.

 

2) int main()

- int : integer의 약자로, 정수형을 뜻한다.

- main() : 함수의 시작을 알리는 요소

 

3) {}

: block을 의미한다.(begin-end와 같은 기능)

 

3) ;(세미 콜론)

: 문장의 끝을 알리는 표현

 

4) return 0

- 0을 운영체제에 반환한다는 의미

- 0을 반환함으로써 컴퓨터에게 실행되었던 프로그램이 무사히 종료되었음을 알림.

 

 

<기본 구조>

 

1) C 프로그램의 기본 단위는 함수이다.

- C언어로 구현되는 모든 프로그램은 반드시 main() 함수를 포함해야 한다.

- C 프로그램이 실행되면, 컴퓨터는 가장 먼저 main() 함수를 찾아서 호출한다.

 

2) 함수 내의 각 명령문은 ;(세미콜론)으로  끝나야 한다.

- 명령문 : 함수의 기능을 정의하는 문장

 

3) C 언어는 대소문자를 구분한다.

- 변수나 함수 명을 작성할 때 또는 키워드나 예약어를 사용할 때,

  대소문자를 정확히 구분하여 사용할 것.

 

4) C언어는 자유형식(Free-format)을 허용한다.

- 문법에만 맞으면 여러 개의 명령문을 한 줄에도 쓸 수 있고,

  하나의 명령문을 여러 줄에 나눠쓸 수도 있다.

- 되도록이면 가독성을 최대화하여 작성하도록 할 것.

 

 

<C system>

 

1) 구문

: 프로그램 규칙

2) 컴파일러 

: C 프로그램이 구문에 맞는지 검사, 오류가 있다면 오류 메세지 출력

3) 컴파일 과정

: C프로그램 → 토큰으로 분리 → 토큰을 목적 코드로 변환

4) 토큰의 종류

: 키워드, 식별자, 상수, 문자열 상수, 연산자 등 

  - 키워드

    : C 언어에서 고유한 의미를 가지는 토큰, 예약어

      ex) if, int, long, register 등

  - 식별자

    : 사용자가 작성한 고유 명사(함수명, 변수명)

 

2. 전처리기

: 컴파일 하기 전, 소스 파일을 처리하는 컴파일러의 한 부분

 

<전처리기 지시어> 

지시어 의미
#include 파일 포함
#define 매크로 정의
#undef 매크로 정의 해제
#if 조건이 참일 경우,
#else 조건이 거짓일 경우,
#endif 조건 처리 문장 종료
#ifdef 매크로가 정의되어 있는 경우
#ifndef 매크로가 정의되어 있지 않은 경우
#line 행번호 출력
#pragma 시스템에 따라 의미가 틀림

 

<#include>

// include 예시 //
#include <stdio.h>       /// 컴파일러의 지정된 폴더에서 찾음
#include "abc.h"         /// 현재 프로젝트 폴더 내에서 찾음
#include "C:\test\abc.h" /// 해당 드라이브 경로 내에서 찾음
#include "..\abc.h"      /// 현재 소스 파일의 상위 폴더 내에서 찾음

 

<#define>

// define 예시 //
#include <stdio.h>
#define AMOUNT 10
#define NAME "사과"

int main(){
	printf("%s %d \n", NAME, AMOUNT);
    
    return 0;
}
// 이렇게도 코딩 가능 //
#include <stdio.h>
#define AMOUNT 10
#define NAME "사과"
#define OUTPUT printf("%s %d \n", NAME, AMOUNT)

int main() {
	OUTPUT;
    
    return 0;
}
// 계산도 가능함 //
#include <stdio.h>
#define CALC(x,y) ((x)*(y))

int main(){
	printf("%d \n", CALC(2,4));
    
    return 0;
}

 

<#if, #ifdef 등>

// #if #else #endif //

#if (조건1)
	실행문(조건1 참)
#else if (조건2)
      실행문(조건1 거짓, 조건2 참)
	  else
      실행문(조건1, 조건2 거짓)
#endif


// #ifdef //

#ifdef 매크로 이름(#define NUM 10)
       실행문(매크로가 정의되어 있을 때)
#else 실행문(매크로 정의x)
#endif // 열었으면 꼭 닫아줄 것!

 

수업 중 메모(정리 안 됨)

더보기
#include <stdio.h>
		//// 전처리기, 표준 입출력 헤더파일들 모음
		//// standard input/output 입출력에 관한 모든 것들이 들어 있다.
#include <stdint.h>
#define MAX 20 /// "앞으로 MAX는 20이야." 라고 정의해두는 것.
			   /// c언어는 대소문자를 가린다(A와 a는 서로 다른 단어)


#include <stdio.h> // 컴파일러에 지정된 폴더에서 찾음.
#include " abc.h"  // 현재 프로젝트 폴더 내에서 찾음. 우리가 만들어준 헤더파일 만들 때는 ""
#include "C:\test\abc.h" // 해당 경로에서 찾음.
#include "..\abc.h" // 상위 폴더에서 찾음.
                    // ..\ : 상위 폴더를 의미
				    // 주석처리 : ctrl k ---> ctrl c
                    // 주석해제 : ctrl k ---> ctrl u
 

	// 여기에 메인 함수의 설명을 쓴다.

// 슬래시 3개 치면, 아래와 같이 뜬다.--> 간략하게 서머리 기록 가능.
/// <summary>
/// 메인 함수의 내용이다.
/// </summary>
/// <returns></returns>
 

int main()  /// int : 정수형의 약자
			/// main 함수는 반드시 있어야 한다.
	        /// 절차적 프로그램 : 순서대로 실행된다.
{
	double /// 예약어 
		a;
	printf("Hello World ! \n\n\n\n"); /// printf : stdio 중 출력 함수, \n : 다음 라인을 만들어주는 것
	printf("Hello World1 ! \n");

	return 0; /// 정수값을 반환시키는 함수
		      /// 프로그램이 잘 실행됐어! 라는 걸 전달해주는 함수.

	/// {} : 블럭을 의미(begin-end와 같다.) 
	/// ; : 문장의 끝을 의미.
}
//// 디버그할 때는 2가지가 있다.(디버그 후 실행, 디버그없이 실행)


// : 한 줄 주석처리
/* 여러 줄
* 
*주석 처리
*/

// "" : 문자열로 취급
// '' : 문자로 취급


int add(int a, int b) { /// add라는 함수를 만듦(함수명은 알파벳 또는 숫자만 가능), 예약어들과 겹치지 않도록 할 것.

	int a = 1;
	int b = 2;

	if (a > 0) { /// () 내부의 값이 참일 경우, 아래 문장 실행
		a = 4; /// c언어에서의 같다(=) : ==
			   /// =는 대입연산자(좌변에 우변의 값을 넣어라)
	}
	else if (b > 0) {
		b = 5;
	}
		else {
			a = b = 0;
		}

	return a+b;
}

//include : 하일 포함ㅇㅇ

 

3. 내장 매크로

 

내장 매크로 설명
__DATE__ 현재 소스 파일이 마지막으로 수정되어 컴파일된 날짜로 치환
__TIME__ 현재 소스 파일이 마지막으로 수정되어 컴파일된 시간으로 치환
__TIMESTAMP__ 현재 소스 파일이 마지막으로 수정되어 컴파일된 날짜, 시간으로 치환
__LINE__ 현재 매크로가 호출된 라인 번호정수형으로 치환
__FUNCTION__ 현재 매크로가 호출된 함수명으로 치환
__FILE__ 현재 소스파일의 경로로 치환

 

#include <stdio.h>
// 내장 매크로 //
// : 이미 정의된 매크로

void fun();

int main()
{
	printf("컴파일 날짜 : %s \n", __DATE__); // 마지막으로 컴파일된 날짜로 치환
	printf("컴파일 시간 : %s \n", __TIME__); // 시간
	printf("컴파일 요일 : %s \n", __TIMESTAMP__); // 날짜, 시간 --> 문자열
	printf("라인 번호 : %d \n", __LINE__); // 현재 매크로가 호출된 라인 번로를 정수형으로 치환
	fun(); // 사용자 정의 함수
	printf("현재 소스 파일 위치 : %s \n", __FUNCTION__); // 현재 매크로가 호출된 함수명으로 치환
	return 0;

}

void fun()
{
	printf("현재 함수 : %s \n", __FUNCTION__);
}

 

※ 모든 함수는 메인함수보다 먼저 정의되어야 한다.

메인함수 위에 다 깔아버리면 복잡하므로, 함수명만 가져와서 쓰면 된다.(나름 instance?)

 

4. 서식 지정자

서식문자 출력대상(자료형) 출력형태
%d char, short, int 부호있는 10진수 정수
%ld long 부호있는 10진수 정수
%lld long long 부호있는 10진수 정수
%u unsigned int 부호없는 10진수 정수
%o unsigned int 부호없는 8진수 정수
%x, %X unsigned int 부호없는 16진수 정수
%f float, double 10진수 방식의 부동소수점 실수
%lf long double 10진수 방식의 부동소수점 실수 
%e, %E float, double e 또는 E 방식의 부동소수점 실수
%g, %G float, double 값에 따라 %f와 %e 사이에서 선택
%c char, short, int 값에 대응하는 문자
%s char *  문자열
%p void 포인터의 주소값

 

""서식 지정자의 갯수와 출력할 값의 갯수가 일치해야 한다.""

오류는 안 나지만, 아무 값이나 출력됨.

// 서식지정자 활용 //

#include <stdio.h>

int main() {
	int num; // 정수형
	float x; // 실수형
	char c; // 문자형(사용자 정의형 데이터)

	num = 123;
	x = 1.23;
	c = 'A'; // '' : 문자
	         // "" : 문자열

	printf("%d %x \n", num, num); // 10진수, 16진수 
	printf("%f %e \n", x, x);     // 부동 소수점
	printf("%c \n", c);           // 문자
	printf("%x \n", num);         // 소문자
	printf("%X \n", num);         // 대문자
	printf("%#x \n", num);        // #소문자(16진수로 0x를 접두어로 붙여 출력)
	printf("%#X \n", num);        // #대문자

	return 0;
}

 

#include <stdio.h>
// 문자 폭 지정 //

int main()
{
	int num = 12345;

	printf("%d \n", num);  
	printf("%d \n", num*10);
	printf("%d \n", num*100);

	printf("%8d \n", num); // 폭을 설정하기 위해 자릿수 지정
	printf("%8d \n", num * 10);
	printf("%8d \n", num * 100);

	printf("%8d \n", num * 10000);
	printf("%08d \n", num * 100); /// 빈 칸에 0을 채움

	return 0;
}

 

#include <stdio.h>
// 정밀도 지정 //

int main()
{
	float x = 12.34567;

	// float = x;
	//x = 12.34567; 이렇게 두 줄로 써줘도 된다.

	printf("%f \n", x);    // 폭과 정밀도 지정 안 함
	printf("%.2f \n", x);  // 정밀도 지정(소수점 2째 자리까지)
	printf("%8.2f \n", x); // 폭과 정밀도 지정

	return 0;
}

 

5. scanf 함수의 형식 문자열

서식지정자 의미 예시
%d 정수를 10진수로 입력 int num;
scanf("%d", &num);
%x 정수를 16진수로 입력 int num;
scanf("%x", &num);
%i 정수를 10진수, 8진수, 16진수로 입력
(012는 8진수, 0x12는 16진수)
int num;
scanf("%i", &num);
%f float 형 실수 입력 float x;
scanf("%f", &x);
%lf double형 실수 입력 float x;
scanf("%lf", &x);
%c 문자 입력 char ch;
scanf("%c", &ch);
%s 문자열 입력 char name[20];
scanf("%s", &name);

 

※ C4996 Warnings

▶2005년 이후 버전부터 scanf', 'fopen', 'strcpy' 사용 시, 해당 오류 출력됨.

 

1. 이유

: scanf가 받을 수 있는 입력 데이터 크기를 넘어선 데이터가 입력 시, 초과된 데이터가 다른 메모리로 침범하여 오류 발생

 secure모드인 scanf_s가 있지만, 호환성 문제가 많으며 버퍼를 설정해 메모리를 직접 지정해 줘야하는 불편함이 있다.

 

2. 해결법

    ① 맨 윗줄에 #define _CRT_SECURE_NO_WARNINGS 전처리

    ② option-전처리기-전처리기 정의에서 편집을 눌러 _CRT_SECURE_NO_WARNINGS를 입력하여 설정

    ③ scanf_s를 쓰거나,(Visual Studio에서만)

    ④ #pragma warning(disable:4996) 요구문을 추가해 경고가 안뜨게 하면 된다.

 

 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	char name[20]; // 이름 배열
	int age;       // 나이
	char gender;   // 성별 M, F

	printf("이름, 나이, 성별(M/F) 순으로 입력하세요. \n");
	scanf("%s %d %c", name, &age, &gender); // s : 문장, d : 정수, c : 한 문자
	                                        // scanf : 치는 것을 받아들이겠다.
                                                // 배열 제외, 앞에 &를 붙여줘야한다.
	printf("나이 : %d \n", age);
	printf("성별 : %c \n", gender);
        printf("이름 : %s \n", name);

	return 0;
}

 

<C언어 제어 문자>

제어 문자 표기 제어 문자 이름 의미
\0 널문자 문자열의 끝을 표시
\a alert, 경고 "삐" 경고음 발생
\b back space 커서를 현재 위치에서 한 글자 뒤로 옮김
\t horizontal tab 커서의 위치를 현재 라인에서 설정된 다음 탭 위치로 옮김
\n  new line 커서를 다음 라인의 시작 위치로 옮김
\v vertical tab 설정되어  있는 다음 수직탭 위치로 옮김
\f form feed 주로 프린터에서 강제적으로 다음 페이지로 넘김
\r carriage return 커서를 현재 라인의 시작 위치로 옮김
\" double quotation "
\' single quotation '
\\ back slash \

 

6. 자료형의 크기

정수형의 자료 크기
실수형의 자료 크기

 

 <sizeof 연산자>

#include <stdio.h>

// sizeof(연산자)를 활용하여 데이터의 크기를 구해보자. // 

int main()
{
	char ch; // 데이터형과 변수명 선언
	int num;
	double x;

	printf("char형의 바이트 크기 : %d \n", sizeof(char)); // 우리가 알고 싶어 하는 변수의 바이트 크기를 반환해준다.
	printf("short형의 바이트 크기 : %d \n", sizeof(short));
	printf("long형의 바이트 크기 : %d \n", sizeof(long));
	printf("long long형의 바이트 크기 : %d \n", sizeof(long long));
	printf("float형의 바이트 크기 : %d \n", sizeof(float));
	printf("double형의 바이트 크기 : %d \n", sizeof(double));
	printf("long double형의 바이트 크기 : %d \n", sizeof(long double));

	printf("변수 ch의 바이트 크기 : %d \n", sizeof(ch));
	printf("변수 num의 바이트 크기 : %d \n", sizeof(num));
	printf("변수 x의 바이트 크기 : %d \n", sizeof(x));
	return 0;
}

 

7. 변수 선언 규칙

: 변수를 선언하려면, 데이터 타입이름이 필요하다.

   ex) int(데이터 타입) amount_apple(변수명);

   - 반드시 영문자, 숫자, 언더바(_)만 사용 가능

   - 첫 글짜는 반드시 영문자 또는 언더바

   - 대소문자 구분 필수

   - C언어 키워드는 변수명으로 사용 불가

 

8. 코딩 명명법

// 카멜 표기법 : 소문자로 시작, 다음 문자는 대문자부터
int manAge;
int womanAge;
int peopleAgeMan;

// 파스칼 표기법 : 모든 단어가 대문자로 시작
int ManAge;
int WomanAge;

// 스네이크표기법 : _를 활용하여 단어 사이를 구분
int man_age

// 헝가리안표기법 : 데이터 타입의 약자를 변수명 앞에 소문자로 적어준다.
String strName;
char ch1;
byte bAge;

// 굳이 지킬 필요는 없고, 그저 하나의 가이드
// 결과가 같다면, 틀린 코딩은 없다. 효율/비효율의 문제

 

9. 변수의 초기화

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 변수의 초기화
// 변수를 선언할 시, 초기화되지 않은 변수의 값은 쓰레기값.

int main() {
	int price; // 변수를 선언, 아직 초기화는 안 한 상태
	price = 100; // 변수의 초기화
	printf("%d \n", price); // 초기화 안 하면, 4byte의 임의의 값을 넣어줌

	return 0;
}

어떤 값으로 초기화해야될 지 모르겠으면, 0으로 초기화하는 것이 일반적이다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 변수의 초기화
// 변수를 선언할 시, 초기화되지 않은 변수의 값은 쓰레기값.

int main() {
	int amount = 0; // 변수 선언
	int price = 0;
	int total_price = 0;

	// int amount, price, total_amount;
	// amount = price = total_price = 0; 이렇게도 변수 선언 및 초기화 가능

	printf("amount : %d, price : %d \n", amount, price);

	printf("수량? \n");
	scanf("% d", &amount); // &amount : amount가 차지하고 있는 주소값을 의미

	price = 2000; 
	total_price = amount * price;

	printf("합계 : %d 원 \n", total_price);


	return 0;
}

 

10. 연산자

 

산술연산자
대입연산자
관계 연산자
논리 연산자
특수 연산자
비트 연산자

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {

	int n = 1;       // 0000_0000_0000_0000_0000_0000_0000_0001
	int r1 = n << 1; // 0000_0000_0000_0000_0000_0000_0000_0010
	int r2 = n << 2; // 0000_0000_0000_0000_0000_0000_0000_0100
	int r3 = n << 3; // 0000_0000_0000_0000_0000_0000_0000_1000
	int r4 = n << 4; // 0000_0000_0000_0000_0000_0000_0001_0000

	printf("결과 1 : %d \n", r1);
	printf("결과 2 : %d \n", r2);
	printf("결과 3 : %d \n", r3);
	printf("결과 4 : %d \n", r4);


	return 0;
}

하나 시프트할 때마다, 2배씩 올라간다 → 시프트 연산자를 활용하여 곱셈을 한다.

C언어에는 감/가산기만 존재하며,

곱셈과 나눗셈은 감/가산기를 활용해서 만든다.

   → 100 ÷ 3 : 3을 몫만큼 빼준다.

   → 100 × 3 : 3을 100번 더한다.

 

11. Overflow

: 변수가 표현할 수 있는 최대 범위를 넘어가는 현상

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {

	char a;

	a = 127;
	printf("%d \n", a);

	a = 128;
	printf("%d \n", a);

	return 0;
}

char 자료형의 범위는 -128~127

 

12. Bitmask

    1) 특정 bit만 clear(0으로 변환)

        : 1을 clear를 원하는 bit(k)만큼 시프트 후, AND 연산

          a &= ~(1<<k)

 

0b11101일 때, 3번째 값을 삭제(0으로 변경) ==> 결과 : 0b10101

   	11101 & ~(1 << 3) 으로 표현
    ==> 0b00001 << 3
    ==> 0b01000
    ==> ~ 시키면 0b10111 

	  11101
	& 10111
	--------
	  10101

 

    2) 특정 bit만 set(1로 변환)

        : 1을 set을 원하는 bit(k)만큼 시프트 후, OR 연산

           a |= (1<<k)

 

0b10101일 때,  3번째 값을 추가(1로 변경) ==> 결과 : 0b11101

	10101 | 1 << 3  으로 표현
    ==> 0b00001을 왼쪽으로 3번
    ==> 0b01000

	  10101
	| 01000
	--------
	  11101

 

    3) 특정 bit만 toggle(비트 반전)

        : 1을 toggle을 원하는 bit(k)만큼 시프트 후, XOR 연산

          a ^= (1<<k)

 

0b10101 일 때 3번째 값 토글 ( 0 -> 1 ) 

	10101 ^ (1 << 3) 으로 표현
    ==> 0b00001 << 3
    ==> 0b01000

	  10101
	^ 01000
	--------
	  11101 ==> 3번째 값이 바뀜

 

    4) k번째 값 조회

        : 1을 조회를 원하는 bit(k)만큼 시프트 후, AND 연산

           a &=(1<<k)

 

0b10101 일 때 3번째 값?

	10101 & (1 << 3) 으로 표현
    ==> 0b00001 << 3
    ==> 0b01000

	  10101
	& 01000
	--------
	  00000 ==> 3번째가 0 이다  : 0이 아니면 무조건 1 이다

 

            cf) 위 네 가지는 임베디드에서 자주 사용됨(함수로 만들어 놓고 쓰면 좋다.) 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {

	unsigned short data = 0x5678; // 0101 0110 0111 1000
	unsigned short msk1 = 0xf000; // 1111 0000 0000 0000
	unsigned short msk2 = 0x0f00; // 0000 1111 0000 0000
	unsigned short msk3 = 0x00f0; // 0000 0000 1111 0000
	unsigned short msk4 = 0x000f; // 0000 0000 0000 1111

	printf("결과1 = %#.4x \n", data & msk1); // & 연산을 활용하여 각 bit를 뽑아낼 수 있다.
	printf("결과2 = %#.4x \n", data & msk2);
	printf("결과3 = %#.4x \n", data & msk3);
	printf("결과4 = %#.4x \n", data & msk4);

	return 0;
}

원하는 bit의 값을 뽑아낼 수 있다.

 

#include <stdio.h>

int main() {

	//unsigned short data = 0x5678; // 0101 0110 0111 1000
	unsigned short data = 0xf000; // 0000 0000 0000 0000
	unsigned short msk1 = 0xf000; // 1111 0000 0000 0000
	unsigned short msk2 = 0x0f00; // 0000 1111 0000 0000
	unsigned short msk3 = 0x00f0; // 0000 0000 1111 0000
	unsigned short msk4 = 0x000f; // 0000 0000 0000 1111

	printf("결과1 = %#.4x \n", data | msk1); // | 연산을 활용하면, f만 뽑힌다.
	printf("결과2 = %#.4x \n", data | msk2);
	printf("결과3 = %#.4x \n", data | msk3);
	printf("결과4 = %#.4x \n", data | msk4);

	return 0;
}

 

13. 형변환

 

정수형끼리의 연산을 하게되면, 결과도 정수로 출력되어야 한다.

따라서 연산 결과를 실수로 얻고 싶다면, 형변환을 활용하면 된다.

 

int main() {

	int a, b, c;
	double average;

	printf("정수 3개를 입력하시오 : ");
	scanf("%d %d %d", &a, &b, &c);

	average = (a + b + c) / 3;
	printf("평균 : %d \n", average);

	return 0;
}

나누어 떨어지지 않으므로 평균이 0으로 출력됨.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 묵시적 형변환 //

int main() {

	int a, b, c;
	double average;

	printf("정수 3개를 입력하시오 : ");
	scanf("%d %d %d", &a, &b, &c);

	average = (double)(a + b + c) / 3; // int값이지만, double로 변경해준다.
                                           // 얘만 묵시적으로 형변환시켜준다.
	printf("평균 : %f \n", average); // d → f 로 바꿔줌.

	return 0;
}

double 안 붙여줌
double 붙여줌

 

728x90
반응형