C 이론(6-2)

Hi Beck·2023년 4월 28일

TIL-Language(C & C++)

목록 보기
8/34

#강의복습
1.printf("x = %d x = %#o x = %#x\n", x, x, x);
-> 결과값 : x = 10 x = 012 x = 0xa
%d x : 10x
%#o x : 10을 8진수로 표현하면 012가 나온다.
%#x\n : 10을 16진스로 표현하면 알파벳a가 나온다.

x는 우리가 원하는 숫자라고 생각하면됨
우리가 쓰는 숫자를 그냥 숫자 그대로 찍고싶으면 %d를 쓴다.
내가 쓰고 싶은 숫자를 8진수로 표현하고싶으면 %0숫자 이렇게 쓰면된다.
내가 쓰고 싶은 숫자를 16진수로 표현하고싶으면 %0x숫자 이렇게 쓰면된다.

중간에 있는 '#'은 뭐냐? : 이건 써도되고 안써도된다.
%#o숫자 = %o숫자
%#x숫자 = %x숫자

2.기호 상수(매직넘버)
=상수를 기호로 바꾸는 것(문자나 이런게 아니라 특정 숫자로 바꿔줄 수도 있음)
해주는 이유 : 가독성 및 유지보수성이 좋아진다.
(우리가 어떤 상수를 변수로 선언하고(예시: 자동차 최대 속도는 100이다.)이 100을 여러번 썼다고 가정했을 때,만약 계획이 바뀌어 최대 속도를 120으로 하면 상수마다 일일히 바꿔줘야하는데 빼먹을 수 있음 그래서 기호 상수가 필요한 것

기호상수로 선언한 후(기호상수 : 상수)에 코드 안 상수를 다 기호상수로 고쳐주면 나중에 선언한 기호상수의 값만 고쳐주면 일괄적으로 다 바뀜 -> 유지보수 효율성 상승

숫자가 없을수록 좋은 코드다.

실제로 회사 코드보면 디파인줄만 몇 만줄임
프로그램이 커지면 기호 상수를 그때마다 쳐야됨
디파인할때 서로 이름이 유사하면 안되니깐 협업이 중요하다!!!!!

기호 상수 쓰는법 2가지,일종의 전처리기임

a.첫번째 방법
#define 기호명 상수(중간엔 띄어쓰기)

얘는 자료명없이 상수가 정수든 소수이든 그냥 넣으면되는데 변수랑은 다르다.기호상수가 동작하는 방식은 내가 정의를 했으면 컴파일이 될 때 컴이 해당 기호명은 그냥 상수로 바꿔버림.애초에 상수이기에 변수가 될 순 없기도하고

b.두번째 방법
const 사용
constant(=일정한,꾸준한)의 약자인데 변수를 상수처럼 변하지않는 수로 바꿔주는 키워드가 const임.변수 선언문 구조 앞에 const를 쓰면 그 변수는 더이상 변할 수 없다.
(이걸 변화시킬려고하면 에러남)

ex) double speed = 0.15; -> const double speed = 0.15;
이 상태에서 만약 speed = 0.2;이렇게 값을 넣으면 에러남.대입불가

const의 존재 이유
변수는 변하는 수 넣으라고 있는건데 굳이 이걸 만들어서 변수에 붙여주는 이유는 뭔지 생각해보면 기호상수란 개념하고 비슷하게 쓰이는 애인데,

#define jumpheight = 10;
const int jumpheight = 10;

int currentheight = 0;

여기에서 현재 높이를 점프헤이트로 즉 기호상수로 바꾸는 방법이 두 가지가 있는데 하나는 currentheight = jumpheight;고,(currentheight = 10;과 같다) 다른 하나는 const문법에서 따온 currentheight = jumpheight;(얘는 10으로 바뀌진않지만, currentheight값이 10이기에 10을 currentheight에 대입해줌.결국 얘도 currentheight = 10;과 같다.)이 있음. 둘이 완전히 동일한 기능을 하는데,두가지 방식 간에 단 하나의 차이점이 존재한다.
그게 뭐냐면 define 방식은 메모리를 잡지않는다!!!
const는 변수 선언문 앞에 있어서 변수값을 못바꾸게 막는것뿐이지 이미 변수 선언하면서 자료형 int는 4바이트 먹고 시작한다.

그럼 define만 쓰면되는거아니냐?
const의 장점이 있어 const를 사용할 때도 있다.(이유에 대한 개념이 아직은 안배운것)

일단 아래 장점때문에 쓰는건데 그게 뭐냐면
명시적으로 자료형을 확인할 수 있다.(define은 자료형 알 수도 없고 정할 수도 없다.자료형은 컴파일러가 정해줌 난 정수형을 의도하고 정의한건데 컴파일러가 플롯으로 취급할 수도 있단 소리임.더블과 플롯간의 차이도 걱정되는데 그래도 디폴트값으로 이 둘은 보정이 잘되게끔 해놔서 현제는 실수를 쓸땐 이슈가 잘나진않음.)

결국 회사마다 쓰는 방식이 다르고 가독성(디파인 생각보다 가독성이 떨어진다함)이냐 메모리를 아끼냐 이거임

참고: const가 기호상수 기능말고 여러 함수 관련 기능으로도 쓰인다.(나중에 나옴)

3.회사의 코드 규약,규칙을 컨벤션이라 한다.(문법규칙x)
= 회사가 이렇게 코드짜서 일한다는 소리

본인만의 컨벤션 만드는 것도 좋음
변수 선언시 보통은 변수명을 x,y로 하는데 이 식별자의 기능을 정확히 표현해주는 용어를 정해주면 좋다.(대문자,소문자,언더바 등 사람마다 다름)
-> 여기서 본인의 컨벤션을 쓰는 목적은 결국 코드의 일관성이다!!!!

프로젝트 만들 때 식별자들이 다 다르면 읽기어렵고 혼잡해지는건 펙트
참고 : 앞에다가 __ 이렇게 언더바 2개붙히는 스타일은 옛날 스타일이여서 피하면될듯

4.변수 선언시 변수 여러개를 한 줄에 쓰는게 효율적인 것 아닌가?
-> 개발자 스타일의 문제다.

int x,y,z; 이런식을 말하는건데 일단 전제조건은 x y z의 자료형은 다 선언한 자료형과 동일 자료형이어야 된다는 것

이렇게 쓰는 것은 초기화를 따로 따로 해줄 수 없다는 단점이 있는데,이렇게 쓰는 사람도 있다고한다.

5.이진수는 전자 스위치로 표현된다.

6.음수를 표현하는 방법
ㄱ.부호비트를 사용해서 음수를 표현하는 방식이 있는데 이건 문제가 있음
예를 들어 +3과 -3을 더하면 0이 되어야되는데 이 두 수를 이진수로 표현해서 더하면 0이 아니라 -6이 나온다.

양수0과 음수0이 존재하기에 생기는 현상인데,이게 무슨말이냐? 부호비트 때문에 생기는 이상한 오류로 보면되는데 부호비트만 있고 나머지가 다 0이라고 했을때(00000000과 10000000이 있을 때 둘 다 0으로 친다는 소리임

0이 양수 음수로 존재할 때 문제가 될 건 또 있다.뭐냐면 표현하는 수의 범위가 좁아진다.우리는 한칸으로 2개를 표현하는데 그걸로 각자 다른 수를 표현해야되는데 0이란 애만 부호비트로는 같은 숫자로 있는 것 0을 이진수로 표현하라할 때 2가지 이진수 중 뭐가 맞는지 판단 불가(실질적으로 양수 음수 더햇을 때 이상한 값이 나온 문제가 주임)

-> 이런 현상때문에 부호비트를 이용하는건 안되겠다해서 방법을 새로 고안해냄

ㄴ.2의보수(1의보수가 먼저 나왔는데 1의보수도 동일한 문제가 있어 2의보수가 나옴)

예로 들어 +3(= 00000011)이 있을 때, 1의보수는 이걸 비트반전(=0을1로, 1을0으로 바꾸는 법)하는 것이다. 그럼 11111100으로 바뀌는데

2의보수는 1의보수를 적용한 것에 1을 더하는 것이다.
그럼 11111100 +1은 11111101 -> -3 이 되는 것(-3이 되는지 어떻게 알지?
00000011 + 11111101을 더해보면 안다.더하면 쭉 0이 되는데 마지막엔 1이 된다.
근데 1이 있는 자리는 자릿수를 초과해서 버린다.그러면 결국은 0이 된다.
(자릿수 초과해서 버리는게 오버플로우랑은 다르다! 자릿수 초과하면 일단 버리는것!)

2의보수로 하면 양수 음수를 더해도 문제가 없기에 2의보수로 양수 음수를 표시한다!

7.음수가 2의보수로 표현되는지 확인하는 예제

int x = 3;
int y = -3;

printf("x = %08X\n", x); // 8자리의 16진수로 출력한다.
printf("y = %08X\n", y); // 8자리의 16진수로 출력한다.
printf("x+y = %08X\n", x+y); // 8자리의 16진수로 출력한다.

아까 %0x는 16진수 %0은 8진수인데 이게 테크닉인데 8은 8자리로 출력해라 이런거임

8자리인 이유는 int가 4바이트니깐 8자리에선 2개 당 1바이트로 쳐야됨
16진수가 2의4승이기 때문에 2가 4칸 있단 소리다.근데 그걸 8자리로 늘리깐 2개당 1바이트가 되는 것임.바이트 4개가 뭉쳐야 16진수인데 1바이트는 8비트니깐 16진수 2개가 1바이트임.

결과가 아래와 같이 나옴
x = 00000003
y = FFFFFFFD
x+y = 00000000

y = FFFFFFFD에 대한 설명

음수를 나타내기위해서 2의 보수를 쓰자
00000003의 8자리 16진수 코드가 있고 이걸 일단 이진법으로 바꾸자
00000011
이걸 1의 보수 적용
->11111100
이제 2의 보수 적용(+1)
->11111101

근데 이걸 16진수로 나타내면 16진수의 밑수 하나하나가 2진법 기준에선 4비트(16=2^4)를 할당하고 있기에 2진수지만 자릿수를 32자리로 일단 생각해야됨 우에서 좌로
1111/1111/1111/1111/1111/1111/1111/1111/1101로 표현이 되는거임(앞 부호비트는 탈락)
여기서 16진수로 바꾸면
밑수 * 증가치의 합 수식을 쓰면 1111=15=F, 1101=13=D가 됨
그래서 3의 음수인 -3은 결국 FFFFFFFD로 표현 가능한 것임.

8.우리가 코드를 배울땐 영어를 많이씀. 모든 문자들이 영어기준으로 만들어져 그 영어기준으로 만든걸 따라가고있엇는데 인터넷 세계에서 우리들만의 언어가 만들어져 한국말의 문자들도 나왔음.이런것들을 표현하기위해서 문자가 아닌 기호들이 나오는 유니코드,멀티코드가 나오기 시작했다.(아스키코드는 영어 기준으로 만든 것)

profile
Emotional realizer

0개의 댓글