C 언어 2장 변수와 산술 연산

이진법

십진수 / 십진수: 0, 1, 2, 3, 4, 5, 6, 11, 58, 99

이진수/이진수: 0 ,1 ,10 ,11 ,100 ,101 ,110, 11100

1비트 = 0, 1

2비트 = 00, 01, 10, 11

8비트 = 00000000, 00000001, 10000000

n비트로 표현할 수 있는 경우의 수는 2^n이다.

기본 변환

이진수를 십진수로 / 이진수 -> 십진수

10 11 = 2^3 * 1 + 2^2 * 0 + 2^2 * 1 + 2^1 * 1 = 11

10진수에서 2진수로 / 10진수 -> 2진수

11 = 1011


1바이트 표현인 경우 상위 4비트는 0으로 채워집니다.

4비트로 11을 나타내는 1101

8비트로 11을 나타내는 00001011

앞의 빈 필드를 0으로 채웁니다.

MSB = Mos Significant Bit 최상위 비트

LSB – 최하위 비트

2진수 및 16진수

16 = 2^4이므로 4개의 2진수 비트는 1개의 16진수 비트와 일치해야 합니다.

10110100 = 1011 / 0100 = B4

1010101111 = 0010 / 1010 / 1111 = 2AF

2진수와 16진수 간의 직접 변환

4자리 단계의 중단, 필요한 경우 0으로 채움

2의 보수

단순히 크기를 표현하는 대신 보어를 통해 부호를 추가합니다.

+5:00000101

– 5: 10000101

첫 번째 비트를 희생해서 0이면 +로 설정되고 1이면 -로 설정됩니다.

이 시점에서 00000000과 10000000은 무엇입니까? 둘 다 문자가 0입니다.

크기는 둘 다 0이지만 -0 +0이 발생합니다.

두 개의 0 발생을 어떻게 해결합니까?

보수의 개념이 포함되지 않으면 연속성이 없습니다.

긍정적인 경우 -> 있는 그대로

음수인 경우 -> 0을 1로, 1을 0으로 변경한 다음 +1을 더합니다.

00000101 -> 만들어 11111010

+1에서

11111011이 됩니다.

= 11111011은 2의 보수로 -5입니다.

반대로 하면 -1을 하고 보완한다.

결과적으로 0이라는 식만 고유하게 유지됩니다.

정수 메모리, 부동 소수점 메모리

저장 가능한 정수 범위

8비트에서 256

부호 없는 경우 0~255, 또는

signed-128 ~ 127(서명된 경우)

n 비트이면 -2^n-1 ≤ n ≤ 2^n-1 -1

다른 비트는 오버플로 오류입니다.

실수는 일정합니다.

부동 소수점 표현이 희박합니다.

부동 소수점 표현

IEEE 754 표준 32비트 부동 소수점 저장 형식

파트 1 비트 기호 8비트 지수 부분 23마디 가수

이진 표현의 정수 부분을 무조건 1로 만드는 과정을 정규화라고 합니다.

변수는 그릇과 같다

수학;

유형 이름 int 변수 이름 수학

유형 = 데이터 유형 = 데이터 유형

a = 밥;

변수에 값을 삽입하는 문장 = 대학 입학

변하기 쉬운

C 언어 데이터 유형

데이터 형식 순수한 32비트 인텔 IA-31 x86-64
소식 하나 하나 하나
존재들 짧은 2 2 2
내부 4 4 4
4 4 8일
긴 긴 8일 8일 8일
부동 소수점 호버링 4 4 4
더블 8일 8일 8일
긴 더블 16 8일 8일

1비트 = 8바이트

double은 배정밀도입니다.

짧은 < int < 긴 < 긴 긴

플로트 < 더블 < 롱 더블

변수가 컴퓨터 메모리에서 차지하는 메모리 양에 관한 것입니다.

서명된 대 서명되지 않은

기본적으로 서명된 것으로 표시됩니다.

int = 서명된 int / 서명된 서명됨!
-127에서 128까지

더 큰 정수는 unsigned int 0-255로 수용할 수 있습니다.

변수의 데이터 유형이 일치해야 합니다.

unsigned int age;
long sum; unsigned long total;
age = 24U;     // 우변 디폴트는 signed int
sum = 24L;
total = 2024UL;

U, L, UL은 유형 일치를 위한 접미사입니다.

유형 변환

더블 합계;

합계 = 0.1234567F; (자동 유형 변환)

total = (double)0.1234567(강제 유형 변환)

정수의 기본값은 int이고 실수의 기본값은 double입니다.

int보다 작은 유형(짧은 문자, 문자)

연산은 int형으로 변환 후 적용됩니다.

유형별 상수 표현식

정수

짧은 – (짧은)97, (짧은)0x61

정수 – 97, 0x61

긴 97L, 0x61L, (긴)97

앞쪽’0x’ 16진수를 의미합니다.

부동 소수점

ASCII 코드


2^7로 설정되어 총 128개이며 7비트로 구현할 수 있습니다.

특수 문자

특수 문자 ASCII 코드 의미
\0 널 부호
\아르 자형 CR 캐리지 리턴
\N LF 개행
\티 수평 라이더
\V VT 세로 탭
\ㅏ 알람 벨 소리
\비 학사 역행 키이
\’ 작은따옴표
\” 큰 따옴표
\\ \ 백슬래시

‘\n’은 개행 또는 개행 문자로 표시됩니다.

문자 및 문자열

성격

작은따옴표로 묶습니다.

‘ㅏ’

큰따옴표로 묶습니다.

끝에 ‘\0′(NULL 문자)을 추가합니다.

그것은 눈에 보이지 않지만 기억을 관통합니다.

문자열이 종료되었음을 나타냅니다.

‘아’와 ‘아’는 다릅니다.

전-

문자 변수는 1바이트 정수이고 문자 상수는 4바이트 상수입니다.

int main(){

	char ch;

	ch="a";

	printf("sizeof(ch) is %d.\n", sizeof(ch));
	printf("sizeof(ch) is %d.\n", sizeof('a'));

	printf("\'a\' in chracter format is %c.\n", ch);
	printf("\'a\' in chracter format is %d.\n", ch);

	ch="a" + 1;
	printf("\'a\ + 1' in chracter format is %c.\n", ch);

	ch = 97;
	printf("97 in charater format is %c.\n", ch);

	return 0;
}
sizeof(ch) is 1.
sizeof(ch) is 4.
'a' in chracter format is a.
'a' in chracter format is 97.
'a + 1' in chracter format is b.
07 in charater format is a.

a는 ASCII 코드로 97이므로 97+1 = 98이고 b는 ASCII 코드로 98이 출력됩니다.

매크로 상수 및 문자 상수

매크로의 의미는 대체입니다.

컴파일할 때 ADULT_AGE를 찾아 즉시 19로 변경합니다.

전. 한글 단어 찾기 및 바꾸기

#define ADULT_AGE 19
#define LONG_MSG "This is very long literal constan \
 long enough to occupy two lines."
// ADULT_AGE 는 기호상수(Macro) 19는 문자상수(Literal)
// '\'은 문자 상수가 이어짐을 표시

전.

#include <stdio.h>
#define PI 3.14
#define ERR_MSG "Error has occurred while opening file.\n"
#define MAX 32.0
#define MIN 10.0

int main() {
	double area, circum, diff;

	area = PI * 3.0 * 3.0;
	printf("The area is %lf.\n", area);
	circum = 2.0 * PI * 3.0;
	printf("The Circumference %lf.\n", circum);

	diff = MAX - MIN;
	printf("The difference is %lf.\n", circum);
	printf(ERR_MSG);
	return 0;
}
The area is 28.260000.
The Circumference 18.840000.
The difference is 18.840000.
Error has occurred while opening file.

변수 이름

* 의미 부여

알파벳, 숫자, 밑줄 및 대소문자를 구분합니다.

가독성이 중요합니다!
정수; 연령 참조;

밑줄로 시작할 때 시스템 라이브러리와 충돌

가능한 조합: 총급여, 총급여

예약어는 사용할 수 없습니다!

C 예약어

예약어

asm 인라인 어셈블리 코드를 지정하는 키워드입니다.

자동차 기본 변수가 저장되는 방법을 지정하는 키워드.
부서지다 for, while, switch 또는 do…while 문을 무조건 종료하는 명령입니다.

사례 switch 문 내에서 사용되는 명령입니다.

가장 간단한 데이터 유형.
끊임없는 변수가 수정되지 않도록 하는 데이터 식별자입니다.

덧없는 참조하십시오.
계속해 for, while, do…while 문을 다음 반복으로 진행하는 명령입니다.

기본 case 문과 일치하지 않는 경우를 처리하기 위해 switch 문에서 사용되는 명령입니다.

하다 while 문과 함께 사용되는 재귀 명령입니다.

루프는 적어도 한 번 실행됩니다.

더블 배정밀도 부동 소수점 값을 저장할 수 있는 데이터 유형입니다.

다른 if 문이 FALSE로 평가되는 경우 실행될 선택적 문을 나타내는 명령입니다.

외부 변수가 프로그램의 다른 부분에서 선언되었음을 나타내는 데이터 식별자입니다.

호버링 부동 소수점 숫자 값을 저장하는 데 사용되는 데이터 유형입니다.

~을 위한 초기화, 증분 및 조건 부분이 포함된 재귀 명령입니다.

이동 정의된 레이블로 이동하는 명령입니다.

만약에 TRUE/FALSE의 결과에 따라 프로그램의 제어를 변경하는 데 사용되는 명령입니다.

내부 정수 값을 저장하기 위한 데이터 유형입니다.

int 유형보다 큰 정수 값을 저장하는 데 사용되는 데이터 유형입니다.

등록하다 가능한 경우 변수가 레지스터에 저장되어야 함을 나타내는 저장 유형 식별자입니다.

돌려 주다 현재 함수를 종료하고 호출된 함수로 프로그램 제어를 반환하는 함수입니다.

함수 값을 반환하는 데 사용됩니다.

짧은 정수 값을 저장하기 위한 데이터 유형입니다.

거의 사용되지 않지만 대부분의 컴퓨터에서 int와 같은 크기입니다.

서명 변수가 양수 값과 음수 값을 모두 저장할 수 있음을 나타내는 데 사용되는 지정자입니다.

크기 요소의 크기를 바이트 단위로 지정하는 연산자입니다.

공전 컴파일러가 변수 값을 보존해야 함을 나타내는 데 사용되는 식별자입니다.

구조 모든 데이터 유형의 변수를 함께 바인딩하기 위해 C에서 사용되는 키워드입니다.

스위치 다양한 조건에 따라 프로그램의 흐름을 변경하는 명령어. case 문과 함께 사용됩니다.

typedef 기존 변수 및 함수의 유형을 새 이름으로 변경하는 데 사용되는 식별자입니다.

노동 조합 여러 변수가 동일한 메모리 영역을 공유할 수 있도록 하는 키워드입니다.

서명되지 않은 변수가 양수 값만 저장할 수 있음을 나타내는 데 사용되는 식별자입니다.

서명 참조.
비어 있는 함수가 값을 반환하지 않거나 사용된 포인터가 범용 포인터이거나 모든 데이터 형식을 가리킬 수 있음을 나타내는 데 사용되는 키워드입니다.

휘발성 물질 변수를 수정할 수 있음을 나타내는 식별자입니다.

const 힌트.
~하는 동안 지정된 조건이 TRUE로 평가되는 한 포함된 문을 계속 실행하는 루프 문입니다.

컴퓨터 하드웨어

폰 노이만 구조

데이터와 프로그램 모두 메모리에 저장

데이터 세그먼트 및 코드 세그먼트

CPU

CU(제어 장치): 명령을 해독하고 실행합니다.

산술 논리 장치(ALU): 산술 및 논리 연산

등록: 작업 결과 및 명령 저장

CPU = 뇌 = 중앙처리장치

저장소 = 메모장 = 기본 저장 장치

CPU와 메모리 사이의 연결을 버스라고 합니다.

제어 버스: 읽기/쓰기 제어

주소 버스: 액세스할 메모리 주소를 전달합니다.

데이터 버스: 읽기 및 쓰기를 위한 데이터 또는 명령을 전달합니다.

단어

데이터 버스의 크기.

일반적으로 주소 버스의 크기와 정수 유형의 크기와 같습니다.

32비트 프로세서(데이터 버스 크기는 32비트)

1워드 = 1워드 전체 = 32비트 = 4바이트

하프워드 = 2바이트, 더블워드 = 8바이트

참조 64비트 프로세서: 1워드 = 8바이트

메모리 주소

주소 지정 방법

바이트 단위 주소 지정과 워드 단위 주소 지정

바이트 단위 주소 지정

32비트 프로세서: 2^32바이트(4GB) 주소 공간

64비트 프로세서: 2^64바이트의 주소 공간

조립 설명서

RR: 등록하려면 등록하세요

RS: 메모리에 등록

SS: 메모리 대 메모리

프로그램 실행 중 메인 메모리 구조

저장 위치(저장 공간) 이름 들어오는 데이터 관리 방법
힙 메모리 동적 변수, 동적으로 할당된 메모리 동적
스택 메모리 지역 변수 동적
데이터 세그먼트 전역 변수, 정적 변수 조용히
코드 세그먼트 개체 코드와 상수 및 함수 조용히

동적: 프로그램 실행 중에 변경되는 메모리 공간(메모리 할당 및 해제)

정적: 프로그램 실행 중에 변경되지 않는 공간.

코드 세그먼트

프로그램 및 상수 데이터를 목적 코드 형태로 저장

읽기 전용

스택 메모리

함수 내에서 선언된 지역 변수 저장

기억의 힙

프로그램 실행 중 생성된 동적 변수 저장

심볼 테이블

난 이해가 안 돼, 이해하고 너에게 화해해

입출력 기능

printf(“메시지”)

%는 형식 지정자입니다.

인수가 여러 개인 경우 차례로 입력됩니다.

int main() {

	int sum, count;

	sum = 0x01020304; //16진수
	printf("Sum is %d in decimal.\n", sum);
	//출력은 10진수가됨 %d = decimal
	printf("%d green %s are on the table.\n", 10, "apples");
	count = printf("Hello.\n");
	printf("printf returns %d.\n", count);



	return 0;
}
Sum is 16909060 in decimal.
10 green apples are on the table.
Hello.
printf returns 7.
// 모든 문자열의 끝에는 /0 (NULL) 문자가 들어가는 것을 기억해야됨
// 그래서 7임!
!
// Hello./0

형식 지정자

형식 지정자 -> 표현 -> 해당 데이터 유형

%d -> 십진수(4바이트) -> int

%ld -> 10진수(8바이트) -> long

%f -> 실수(4바이트) -> 부동 소수점 수

%lf -> 실수(8바이트) -> double

%c -> 문자 -> 문자

%s -> 문자열 -> 문자*

%o -> 8진수 -> 정수

%x -> 16진수 -> int

%p -> 주소 값 -> 무효*

%u -> 부호 없는 10진수(4바이트) -> 부호 없는 정수

%lu -> 부호 없는 10진수(8바이트) -> 부호 없는 long

printf 문의 형식 지정자

모든 화면 입력은 텍스트입니다.

형식 지정자 = 변환 코드(읽은 상태로 변환)

int main() {
	float f; double d; int i;

	f = 0.123456789123456789F;
	d = 0.123456789123456789;
	printf("float f is %f.\n", f);
	printf("double d is %lf.\n", d);
	printf("float in .20f is %.20f.\n", f);
	printf("double in .20lf is %.20lf.\n", d);
	printf("double in 25.4lf is\n%25.4lf.\n", d);
	printf("double in -25.4lf is\n%-25.4lf.\n", d);

	i = 365;
	printf("int in -8 is %-8d.\n", i);
	printf("Exponent form of 123456.78 is %e.\n", 123456.78);

	return 0;
}
float f is 0.123457. // %를 쓰면 6bit가 default 임.
double d is 0.123457.
float in .20f is 0.12345679104328155518. //'.20' 하면 소수점 20개까지 나옴.
double in .20lf is 0.12345678912345678380. // data 타입에 따라 결과가 틀릴 수 있음 (부호부, 지수부, 가수부)
double in 25.4lf is // 소수점 끝자리를 4로 맞추돼 전체 25자리를 차지해라
                   0.1235.
double in -25.4lf is // 여기서 '-'의 의미는 좌측정렬이다.

0.1235 . int in -8 is 365 . Exponent form of 123456.78 is 1.234568e+05.

압력

아무것도 변환할 수 없습니다.

전.

printf(“%f”, 44);

printf 함수 프로토타입

반환 유형, 함수 이름, 인수

int printf (const char* is format, arg1, agr2, …);

printf는 헤더 파일의 함수입니다.

정의됩니다.

int main() {
	int age, count; double weight, height;

	printf("Enter age.\n");
	scanf("%d", &age);
	printf("Age: %d.\n", age);
	printf("Enter weight and height.\n");
	scanf("%lf%lf", &weight, &height);
	printf("Weight : %lf, Height: %lf.\n", weight, height);
	printf("Enter weight and height again.\n");
	count = scanf("%lf%lf", &weight, &height);
	printf("scanf returns %d.\n", count);

	return 0;
}
Enter age.
26
Age: 26.
Enter weight and height.
75 178
Weight : 75.000000, Height: 178.000000.
Enter weight and height again.
75 178
scanf returns 2.

스캔프

scanf 함수의 프로토타입

int scanf(const char*format, &arg1, &arg, …);

& = 주소 연산자

scaf: 변수 이름 앞의 주소 연산자

&age = 나이의 주소 = 나이 변수의 주소

가변 기능

프린트프, 스캔프

인수의 수는 가변적입니다.

int main() {
	unsigned char ch; int num;

	printf("Enter a character.\n");
	scanf("%c", &ch);
	printf("it is %d in decimal.\n", ch);
	printf("Enter the same character again.\n");
	scanf("%d", &num);
	printf("it is %d in decimal.\n", num);

	return 0;
}
Enter a character.
7
it is 55 in decimal.
Enter the same character again.
7
it is 7 in decimal.

화면에 보이는 것은 텍스트뿐

2는 ‘2’

%c로 읽으면 ‘2’

%d로 읽으면 자동으로 숫자 2로 변환됩니다(atoi 함수, 영숫자에서 정수로).

흰색 문자

탭, 스페이스바, Esc, Enter

scanf는 숫자를 공백으로 구분합니다.

scanf("%d\n", &age); //Remove \n
scanf("%lf %lf", &weight, &height); //Remove blank
scanf("%lf,%lf", &weight, &height); //Remove comma

서식 지정자를 사용할 때 피해야 할 사항에 대해!
예!

기본적으로 스캔할 때 Enter 키를 누릅니다.

\n 추가 줄 바꿈을 추가합니다.

불필요한

다른 것은 오류가 발생합니다.

형식 지정자가 가장 사용하기 쉽습니다.

I/O 버퍼


모니터와 CPU 사이에 속도 차이가 있습니다.

따라서 중간에 약간의 메모리가 있어야 합니다.

이러한 것을 버퍼 메모리라고 합니다.

완충기

버퍼 저장. 스트림 내에 존재

I/O 장치와 CPU 사이의 속도 차이 극복

int main() {
	char ch1, ch2;
	printf("Enter two characters.\n");
	scanf("%c%c", &ch1, &ch2);
	printf("Characters just read are %c and %c.\n", ch1, ch2);

	return 0;
}
Enter two characters.
A S
Characters just read are A and  .

%c로 읽을 때 공백 또는 입력은 한 문자로 처리됩니다.

용해

1. %c와 %c 사이에 공백을 넣습니다.

2. %c%c%c

3. &ch1, &blank, &ch2

Enter 키가 남아 있으면 버퍼 지우기가 필요합니다.

cf. %d로 읽을 때 공백을 건너뜁니다.

int main() {

	char ch1, ch2;

	printf("Enter the first character. \n");
	scanf("%c", &ch1);
	printf("First character is %c.\n", ch1);

	printf("Enter the second character.\n");
	scanf("%c", &ch2);
	printf("Second charater is %c", ch2);

	return 0;
}

위의 코드를 실행하면 오류 메시지가 나타납니다.

Enter the first character.
1
First character is 1.
Enter the second character.
Second charater is

두 개의 입력을 수신해야 하지만 위의 출력과 같이 하나만 수신하고 종료합니다.

입력으로 1 다음에 Enter가 오기 때문입니다.

scanfs가 2개일 때 나타날 수 있는 오류로 해결 방법은

두 번째 %c 앞에 공백을 두십시오.

scnaf(“%c”, &ch2);


1. 이진수 110010011000111100을 십진수를 거치지 않고 직접 16진수로 변환합니다.

2. 십진수를 거치지 않고 B1A2EC9를 4바이트 바이너리로 직접 변환해 보십시오.

3. 8비트 산술에서 2진수 보수로 49 – 1을 계산하고 결과가 맞는지 확인

참고 – b7 연산 결과의 정수 오버플로b6으로 평가됩니다.

⊕는 XOR(Exclusive Or)의 기호로, 이 값이 0이면 최상위 비트에 캐리 비트가 있는지 여부에 관계없이 올바른 결과로 간주됩니다.

반면에 이 값이 1이면 유효하지 않은 결과로 간주되어 오버플로 오류가 발생합니다.

4. 8비트 연산에서 2진 보수로 127 + 1을 계산하고 결과가 올바른지 확인

5. 18.375의 부호, 지수 및 가수를 32비트 부동 소수점 숫자로 계산합니다.

첫째, 18.375에서 이진수로의 변환은 10010.011(2)입니다.

10010.011(2) = 1.0010011(2) × 24로 표현할 수도 있는데, 이를 정규화된 부동 소수점 수라고 합니다.


지수는 4인데 32비트 바이어스인 127을 더하면 131이 된다.


131을 이진수로 표현하면 10000011(2)가 됩니다.


가수는 1.0010011의 분수이며 크기는 23비트입니다.

빠진 부분은 0으로 채우세요.
분수: 00100110000000000000000
징후 0 지수 1 0 0 0 0 1 1 가수 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
부동 소수점 표기: 0100000110010011000000000000000(2)

6. 다음 문장을 화면에 출력

소비자 가격이 1/10로 인상되었습니다.

그것은 10%와 같다’

printf("\'Consumer price\' has increased by 1/10. It correspond to 10%%'");

7. 실수를 입력한 후 캐스트 연산자를 사용하여 입력값을 정수형으로 변환하여 출력한다.

> 실수를 입력하십시오.

>88.99999(키 입력)

>88

int main() {

	double num1;

	scanf("%d", &num1);
	printf("num1 = %d", num1);

	return 0;
}

8. scanf를 사용하여 여성 이름의 처음 몇 글자를 입력하고 printf를 사용하여 화면에 출력하는 프로그램을 작성하십시오.

알아두기 – 문자형 변수를 선언할 때 사용합니다.

>JYP (엔터)

> 이름의 첫 글자는 J, Y, P입니다.

int main() {

	char ch1, ch2, ch3;
	scanf("%c%c%c", &ch1, &ch2, &ch3);
	printf("Initial of your name are %c, %c and %c.", ch1, ch2, ch3);

	return 0;
}

9 .print 함수를 이용하여 한글 이름, 행선지는 물론 원하는 메모를 화면에 출력하되 한 줄씩 새 줄에 출력하는 프로그램을 작성하시오. 단, 형식 지정자를 사용해야 하며 이름과 목적은 문자열(%s) 형식, 학점은 문자(%c) 형식이어야 합니다.

int main() {

	char* Korea_name, *Purpose;
	char Grade;
	Korea_name = "KDJ";
	Purpose = "Learning C_programming";
	Grade="A";

	printf("한글 이름 : %s\n수강 목적 : %s\n희망 학점 : %c" 
		, Korea_name, Purpose, Grade);
	
	return 0;
}

10. 아래 밑줄 부분에 코드를 입력하면 ASCII 코드표를 화면에 바로 출력할 수 있습니다.

단, 특수문자나 공백으로 인해 이상한 문자가 나타나거나 아무것도 보이지 않더라도 사진을 찍어야 합니다.

int main() {
	int i;
	for (i = 0; i <= 127; i++){
		printf("%d = ", i);
		printf("%c\n", i);

	}

	return 0;
}