1.코딩을 할 땐 프로처럼 꼼꼼히 보자!!!
오타, 자료형의 상관 코드 관계, 엔드연산자 안씀, 선언 중복 등 이런 문법적 실수를 인지할 수 있어야하고 체크할 수 있어야지 뒤에서 배우는 코드들을 쓸 수 있다.
앞에 부분을 꾸준히 복습하자!
언어를 배우는데 있어서 시행착오를 겪는 과정이니 거기서 배우자! 중요한건 코딩 오타, 맞는지 틀린지 보다 그 이후에 고칠 때 방식이 중요하다.
수정해서 되면 그냥 넘어가자X -> 왜 틀렸는지, 내가 뭘 빼먹었는지, 뭘 더썼는지, 위랑 아래에서 안본게 있는지,이 문법이 정말 맞는지, 문법에 관한 이론을 확실하게 알고있는지,여기에 이 값을 왜 넣어주는지 등 이해를 하면서 체크해야 다음에 안틀림.
기본베이스를 안다고 착각하고 다음으로 가면 점점 그건 생략하게 되고 기초가 무너진 상태로 이해못한 정보만 추가로 들어와서 더 꼬이는 것
그래서 기초를 체화하는 과정이 지금은 중요하다.나중에 프로들끼리 대화하는데 영향을 미침
확실히 알고 짠 코드가 아닌데 맞은 경우 넘어가면 안된다.
-> 이거 다시 봐야됨.그대로 넘어가면 또 틀리는 것임
그리고 지금 코드를 효율적으로 짜는건 경험의 영역으로 요령이 생길려면 경험이 많아야된다.열심히 코딩하다보면 자연스럽게 자기의 효율적이라는 기준이 생길것이고(시간,메모리,코드 수)지금은 문법 및 기능 학습을 중심으로 코딩하기
2.자료형을 unsigned로 하냐의 유무는 맞다틀리다가 아니라 프로그래머의 작업 스타일에 따라 다른 것
signed는 생략한다.즉 우리가 여태 쓴 자료형들이 다 signed임
3.오버플로우
자료형이 범위를 표현한 이유가 이 변수가 사용하는 바이트의 숫자 갯수 때문임
비트는 최소단위이기 때문에 들어갈 수 있는 숫자는 0과1뿐
처음에 0이 있다하고 거기에 더하기1을 해주면 1로 바뀌는데 여기서 내가 더하기 1을 또 해주면 원래는 2가 되어야되는데 이 비트 속에선 표기가 0하고1밖에 안돼서 이 자리는 0이 되고 추가된 값이 자리올림이 돼서 다음 비트에 1이 들어간다. 그런고로 10이라는 이진수 표기가 됨.이렇게 비트나 바이트도 자릿수가 존재하는데
여기서 오버플로우는 이 자릿수를 넘어갔을때 발생되는 현상이다.
만약 int 자료형 비트(4바이트 -> 32비트)에서 0에서 계속 1씩 더했을때(32개의 비트상자 상상) 결국은 32칸이 다 11111111111.........로 채워질 것이다.
32 비트가 다 1이 되는 순간에 더하기1을 한번 더 하면 끝자리는 0이 되고 그 다음 비트도 1이 더해지면서 0이 되고 그렇게 다 0이 되고 맨앞에 추가로 1이 더 생겨야됨.
여기서 문제는 우리는 32비트 칸만 가지고 데이터를 표현하기로한 약속을 한 상태임.
그렇기에 int비트는 32비트를 넘어갈 수가 없다!
그럼 추가로 생긴 1을 어떻게 하냐?
이 1을 다르게 처리한다.
2147483647이 int형의 맥스값인데(맥스값이 의미하는 것은 비트가 다 11111로 채워진 형태를 의미한다 = 1을 계속 더한거와 숫자는 비례하니깐 )
x를 최대값인 2147483647로 대입했을때
x = 2147483647
x+1 = -2147483648
x+2 = -2147483647
x+3 = -2147483646 이렇게 되는데
x+1 = -2147483648같은 경우는 int형 범위의 최소값이다.
맥스값에다가 1을 더했는데 민값이 되어버렸다???
이렇게 값이 거꾸로 가버린 현상을 오버플로우라고 생각하면된다.범위를 원형의 띠라고 생각하자.
= 위로 넘쳤을때는 맨 아래의 끝으로 간다고 생각하자
이게 왜 순환되는 구조냐면
일단은 한정된 비트로 수를 표현해야되는 상황에서 비트 중 양수나 음수를 표현할 수 있는게 필요한데 맨 앞에 부호비트를 넣어준다.(양수 0 음수 1)
즉 우리가 쓰고자하는 비트칸에 1은 제외하고 비트수-1 나머지칸들에는 숫자를 표현한다.
예시) 000~1 == 1 100~1 == -1
그 다음엔 아까 2147483647란 값은 사실 앞에가 0이고 나머지31칸이 다 1이다.
0111~1 이 상태에서 1을 더하면 1000~0이 되는데 그러면 0 아닌가 생각할 수 있지만
뒤에 배우는 '이해보수'라는 개념을 적용하면 -2147483647이 된다.
오버플로우가 규칙성있게 동작한단 말은 이 순환되는 것을 말한 것임
다른 자료형인 unsigned int의 오버플로우는 4294967295가 최댓값인데 여기서 1을 더하면 -가 아니다.왜냐면 unsigned int의 범위의 최소값은 0이니깐
그래서 y를 4294967295라고 했을때 아래와 같다.
y = 4294967295
y+1 = 0
y+2 = 1
y+3 = 2
오버플로우는 에러는 아니지만 잘못된 값이기때문에 절대 나면 안됨.
큰 숫자들은 곱하거나 더할때 오버플로우가 발생함
자료형을 선택할 땐 프로그램의 사용자, 메모리 한계, 메모리 상태, 가능성을 고려하되 기능에 문제없게!
이 프로그램은 21억명까진 안쓸것같아 -> int형 사용
이 프로그램은 전세계 사람들이 다쓸듯 -> long long형 사용
스킬로 큰 숫자를 쓰면 가독성이 떨어짐 그니깐 큰 액수단위(예로 들어 억)가 무조건 넘어가면 그 단위를 짤라버리고 표기하는 것이다.
4.정수 상수
숫자 코드 끝에다가 알파벳을 붙이는 경우가 있는데 이러면 이 알파벳이 자동으로 숫자의 자료형을 정해준다.근데 요즘엔 이런 테크닉을 거의 안씀 - 그냥 참고
-정수 상수는 10진법 이외의 진법으로도 표기가 가능하다는말인데 다른 진법으로 표기하는게 어디에 쓰이는지?
16진법은 메모리 주소값에 쓰이는데 컴퓨터는 1바이트당 8비트를 최대한 많이 짧게 표현하기위해서 16진수로 뱉어주는 것이라고 생각을 하면되는데,
우리가 보통 비트에 들어가는게 이진수 뿐이니깐 0과1을 쓰자나 근데 이걸 주소값을 10진수로 쓴다 상상하면 10진수는 0부터 9까지 표현이 되는데 이 이진수를 10진수로 끊어내기가 어렵다.이게 무슨말이냐면 0과1로 구성되어있는 코드를 십진수로 바꿔버리면 숫자가 더 길어진다.(만약 4바이트면 32비트인데 그걸 10진수로 표현한다고 가정하면 30개의 비트까지 끊어주고 나머지 2비트를 짜르기가 애매하다.그래서 40비트로 처리해줘야됨(이해안됨)) , 여튼 중요한건 컴퓨터 입장에선 이게 기니깐 이걸 사용자에게 최대한 짧게 보여주고싶어한다.그런 의미에서 16진수가 짧은 비트에 가장 많은 숫자를 표현할 수 있어 효율적이라는 뜻이다!!!
우리가 주소에 접근할 때 주소값 코드엔 관심이 없다.우리가 관심있는 것은 scanf에서 그 주소값을 넘겨줄 수 있는지만 궁금한거지 그외는 관심없다.걔가 10진수로 표기될 이유가 전혀없는 것이다.(=메모리를 우리가 읽기 편하게 할 이유가 없다.)
그럼 가장 효율적인 숫자는 한자리에 16개를 표현할 수 있는 16진수가 4자리 비트를 가지고 데이터를 표현할 수 있으니깐 이득이라는거임
tip
몇진수의 몇을 2의n승으로 치환해서 생각하면 몇비트 자릿수인지 알 수 있다.(2^0부터인거 주의하고)
예시 : 16은 곧 2^4, 2^3 2^2 2^1 2^0 그러므로 4자리다.
5.(중요한 내용)10진수,8진수,16진수를 숫자로 표현하는 방법
ㄱ.10진수를 숫자로 표현하기
10진수를 숫자로 표기하는건 우리가 매일 써오던 숫자들과 같음
비트 한칸에 0부터 9까지 10개의 숫자가 들어가는것이여서 1부터 큰숫자까지 계속 표현할 수 있다.
-> 10은 10진수고 int형이고 값은 십진수로 10이다.
ㄴ.8진수를 숫자로 표현하기
비트 한 칸에 0부터 7, 총8개가 들어갈 수 있음(0,1,2,3,4,5,6,7,10,11,12,13,14,15,16,17)
8진수는 숫자 앞에 0을 붙여준다.10이면 010, 11이면 011로
이때 010에서의 1은 자리올림이 돼서 1이 된 것 그말의 8이 돼서 넘어간 것
그래서 010은 십진수의 숫자(=걍 우리가 쓰는 숫자)로 표현했을땐 8과 같은 것이다.
다시 복습해보기
n진수 코드를 숫자로 표현하기(자릿수마다 그 만큼 계속 곱해서 더하면됨)
여기선 일단 10진수로 n을 10으로함. 만약 100이 있다치면
10의2승 1 + 10의1승 0 + 10의0승 * 0로 계산하는거임
10의0승자리,10의1승자리,10의2승자리 이렇게 있는것임
이진수라면
2의0승자리,2의1승자리,2의2승자리 이렇게 있는거고
위의 010도
보면 10이 있는데 이걸 팔진수로 보고싶을때 8의1승 1 + 8의0승 0 = 8이 된거임
근데 얘가 몇진수인지를 모르니깐 구분하기위해 0을 붙여준 것이다.
-> 010은 8진수고 int형이고 값은 십진수로 8이다.
ㄷ.16진수를 숫자로 표현하기
0x10처럼 16진수는 앞에 0x(=숫자0에 알파벳x)를 붙혀준 것이다.
-컴퓨터에서의 곱하기는 무조건 *
16의1승 1 + 16의0승 0 = 16
-> 0x10는 16진수고 int형이고 값은 십진수로 16이다.
응용
0x1B3을 숫자로 나타내면
16^2 1 + 16^1 11 + 16^0 * 3 = 435
십진수가 8이라고 했을때 8진수에선 자리가 증가(8을 표현할 수 없으니 10,11,12...으로 넘어간다) 역시 16진수도 십진수가 16일때 16진수가 10으로 넘어감(얘는 9부터 알파벳이 껴있어서 그걸 껴줘야됨)