C언어 1일차

2022. 2. 15. 13:12디지털디자인/코딩

오늘은 시작한지 1일차

1일차라고 하기에도 뭐한게 그냥 간단히 훑어보는 정도였다. 

 

씹어먹는 C언어라는 교재의 pdf파일로 공부하였다. 개인적으로 그래픽관련은 영상으로 코딩언어는 책으로 공부하는 것을 선호하는 편이기 때문이다. 

visual studio를 컴파일러로 사용하였다. 

 

C언어가 기존에 알고 있는 java와 비슷한점이 있어서 다행이였다.

하지만 bit, byte이런 개념을 같이 끌고가기가 어려웠다.

 

메모리의 한 개의 메모리 소자는 0 아니면 1 의 둘 중의 한 개의 값만 보관할 수 있음. 이걸 우리는 2진수로 표현하고 2진수 한자리를 비트(Bit) 라고 한다. 

그래서 사람들은 더 많은 정보를 표현하기 위해서 비트를 8개 묶어 사용하는데 이것이 Byte(바이트) 1바이트 = 8비트

 

C언어에서 변수를 선언하면 메모리에 기억장소를 할당하게 되는데 1바이트, 2바이트, 4바이트, 8바이트 .. 어떤 변수를 선언하느냐에 따라 확보되는 기억장소의 크기도 달라짐

 

CPU 에는 레지스터(register)라는 작은 메모리 공간이 있는데, 이곳에 값을 불러다 놓고 연산을 수행함. 32 비트 컴퓨터는 1워드가 32 비트,  4 바이트 이고 64 비트 컴퓨터의 경우 1워드가 64 비트,  8 바이트

 
 
자료형 Byte수 범위 
 정수형
 
short 2byte -32768 ~ 32767
int 4byte -2147483648 ~ 2147483647
long 4byte -2147483648 ~ 2147483647
unsigned short 2byte 0 ~ 65535
unsigned int 4byte 0 ~ 4294967295
unsigned long 4byte 0 ~ 4294967295
문자형
 
char 1byte -128 ~ 127
unsigned char 1byte 0 ~ 255
실수형 float 4byte 1.2E-38 ~ 3.4E38
double 8byte 2.2E-308 ~ 1.8E308

시작하기

#include <stdio.h>
// 키보드 입력 화면에 출력해주기 위해서 해당 운영체제가 담긴 파일을 가져와야함//
int main() {
	/* 
	int를 쓰는 이유 정수형을 반환한다는 뜻
	\n의 의미는 띄어쓰기
	0을 반환한다는거는 프로그램 무사 종료를 뜻함
	*/

	printf("Hello World! \n");
		return 0;
}

 

변수설정

정수형의 종류

#include <stdio.h>

int main() {
	int a;
	a = 10;
	//%d : ""다음에오는 첫번째 변수를 10진수로 써라
	printf("a의 값은 %d \n", a);
	return 0;
}
#include<stdio.h>

int main() {
	int a;
	a = 127;
	printf("a의 값음 %d 진수로 %o 입니다. \n", 8, a);
	printf("a의 값은 %d 진수로 %d 입니다. \n", 10, a);
	printf("The value of a is %x in %d notation \n", a, 16);
	//pritnf(%d %d %d %d,a,b,c,d)라면 abcd가 순서대로 출력됨, %o는 8진수 %x는 16진수
	return 0;

	/*
	a의 값음 8 진수로 177 입니다.
	a의 값은 10 진수로 127 입니다.
	The value of a is 7f in 16 notation
	*/


}
#include<stdio.h>

int main() {
	float a = 1.1234f;
	float b = 1.1234;
	int c = 123;

	printf("a;%.2f\n", a);
	printf("b:%6.3f\n", b);
	printf("c:%5d\n",c);
	return 0;
	//f는 float d는 int 반환할때 쓰임
	//6.3f은 6번째 이상 자릿수+3번째 소수점 까지 나타내는 것 

	/*
	a;1.12
	b: 1.123
	c:  123
	*/

}

계산하기

#include<stdio.h>

int main() {
	int a, b;
	a = 10;
	b = 3;

	printf("a+b : %d \n", a + b);
	printf("a-b:%d\n", a - b);
	printf("a*b:%d\n", a * b);
	printf("a/b:%d\n", a / b);
	/*
	이때 %f쓰면 안됨 정수연산은 값이 정수로 나옴, 
	but 둘중하나라도 double이나 float라면 다른하나가 산술변환하여 범위가 더큰 형태로 바뀜 그땐 %f
	*/
	printf("a%%b:%d\n", a % b);
	//나머지 구할때 %한개만 쓰는것!""사이에 %하나만 집어넣으면 %d %f같이 사용될 수 있음

	printf("a++: %d \n", a++);
	printf("++a: %d\n", ++a);
	//a++은 a값먼저 반환후 1을 더해주고 ++a는 1을 더하고 값을 반환해준다.

	return 0;



}

비트연산자

& (비트 AND 연산)
대응되는 비트가 모두 1이면 1을 반환
| (비트 OR 연산)
대응되는 비트 중 하나라도 1이면 1을 반환
^ (비트 XOR 연산)
대응되는 비트가 서로 다르면 1을 반환
~ (비트 NOT 연산)
비트가 0이면 1, 1이면 0 으로 반전
<< (Left Shift 연산)
비트들을 모두 지정 수 만큼 왼쪽으로 이동
>> (Right Shift 연산)
비트들을 모두 지정 수 만큼 오른쪽으로 이동

 

음수표현 방법

 
  • 첫번째
0000 1010 = 10 1000 1010 = -10 ---------------- 1001 0100 - -20

가장 왼쪽(128 자리)의 부호 비트가 켜져(1) 있으면 음수(-)

가장 왼쪽(128 자리)의 부호 비트가 꺼져(0) 있으면 양수(+)

-> 여기서의 가장 왼쪽의 비트는 128 값을 갖는게 아닌 "부호비트" 로 사용된다.

그러나 첫번째 방법 사용되지 않는 이유로는

2진수의 합(0) 과 10진수의 합(-20)이 동일해야 하는데,

계산이 동일하지 않기 때문에 사용되지 않는다.

  • 두번째 : 1의 보수
0000 1010 = 10 1111 0101 -> 1의 보수 = -10

이는 각 비트에 1이 되도록 반전시켜주는 것으로,

이미 1이 존재하는 비트에는 0 으로 채워준다.

1001 1100 = - ? 0110 0011 = 99 따라서 1001 1100 = -99

가장 왼쪽의 부호 비트가 1로 켜져있기 때문에 우리는 음수라는 것을 예상할 수 있고, 1의 보수로 전환시켜서 양수의 값을 찾아서 구해주면 된다.

하지만 두번째 방법도 사용하지 않는다.

그 이유로는

0000 0000 = 0 1111 1111 = -0

이처럼 1의 보수를 사용하게 되면 0의 값이 양수, 음수

총 2가지가 나오기 때문에 사용하지 않는다.

 

  • 세번째 : 2의 보수

0000 1010  1111 0110 을 더하면 1 0000 0000이 되는데 이건 8비트에서 벗어나므로 0000 0000이 되어 0이된다. 따라서 두수를 합치면 0이 되는 것이다. 이것을 2의 보수라고 한다.

2의 보수 : 1의 보수에 1을 더해준 수

0000 1010 = 10
1111 0101 -> 1의 보수 = 10
1111 0110 -> 2의 보수 = -10

Overflow

#include<stdio.h>

int main() {
	int a = 2147483647;
	printf("a: %d \n", a);

	a++;
	printf("a : %d \n", a);
	//2147483647은 int표현 최댓값, +1을하면 음수가 나옴
	return 0;

}

/*
a: 2147483647
a : -2147483648
*/

2147483647은 2진수로 0111 1111 1111....... 인데 a++로 인해 1000 0000 0000......가 된다. 

이때 0111 1111 1111.....의 2의 보수는 1000 0000 0000이므로 음수가 나온다. 이걸 overflow라고 하는데 c언어 자체에서 이걸 해결해 주지 않으니 알아서 항상 자료형 크기 신경써야함

 

음수개념이 없는 unsugned int라는 자료형도 있다. %u를 통해 불러올 수 있다.

 

'디지털디자인 > 코딩' 카테고리의 다른 글

midjourney이미지 runway영상으로 만들기  (0) 2023.09.20
딥러닝 개론  (0) 2022.11.24
데이터 사이언스 기초 수학 정리  (0) 2022.11.24
phython3 오답노트  (0) 2022.07.14
c언어 2일차  (0) 2022.02.16