이러한 경우일 때 char = 1바이트 == 8비트
문자형 1개 2의 8승
-127 ~ 128 => 255 까지 표현 가능하니까
256 넣으면 비트가
1 만 켜주게 되서 0으로 나옴
unsigned == 양수만 표현하자.
어떤애를 음수로 보냐?
1바이트의 첫번째 부분 빼고 비트가 7개밖에 없다고 생각해보아라.
제일 앞 비트가 0일때의 숫자 128개를 "양수"로 보고
1일대 128개를 "음수"로 봄
"양수" = 0 ~ 127 == 128개
"음수" = -1 ~ -128 == 128개
128 + 128 = 256개
그래서 제일 앞에 있는 비트를
"MSC"라고 부름 Most Significant Bit
음수냐 양수냐 판별하는 최상위 부호 비트
MSB가 1이니까 이거 -1이니겠네?
아님!
실제 음수는 이렇게 표현되지 않는다!
컴퓨터가 어떻게 음수 다루는지 보면
CPU가 연산 최적화를 위해 전자회로에서 하는데
이진수 덧셈도 그냥 이렇게 1 1 이면 자릿수 올린다.
CPU에서는 뺼셈 따로 안 만들고
양수 + (음수) 해서 음수에 다른 접근 방식이 필요함.
10이랑 더해서 0이 나오는 수가 -10이라 생각하고
5랑 더해서 0이 나오는 수를 -5라 본다.
이렇게 접근하는 것임
양수 1일 경우
전부다 1로 채워져있는게 음수 -1이다.
왜?? 시발 -1이노? => 아까
0 0 0 0 0 0 0 1
이 뭐라하드노? -> 1이라고했다.
그러면 -1은 어떻게 구하노?
1과 더했을 때 0이 되는 수는 -1인데
0 0 0 0 0 0 0 1
이녀석이 0이 되려면
0 0 0 0 0 0 0 0
으로 만들어 줘야되는데
1 1 1 1 1 1 1 1
을
0 0 0 0 0 0 0 1
에 더해주면
1 | 0 0 0 0 0 0 0 0
이 되어버림
그래서 signed char == 1byte에서는
1 1 1 1 1 1 1 1
이 "-1"이 되는 것이다.
ㅇㅋ???
그러면 두개의 비트가 같은가??
언사인드 c랑
char c1이랑
둘다 비트는 싹다 1로 채워져있다.
둘다 이렇게 되어있는데 "어떻게 해석"을 하냐에 따라서 다른 숫자가 된다.
이게 "포인터"와 연관 되어있다.
음수의 관점에서 보냐 아니면 양수의 관점에서 보냐 그차이이다.
< 중간 정리 >
이녀석은 값이 뭘까 그럼?
255이다.
왜? 1이랑 더해서 0이 나오는 숫자는 -1이다.
모든 비트가 1일 경우에 "음수"로 치면 -1이다.
왜냐하면 지금 "양수"일 경우
모든 비트가 1이면 255인데
1에 어떤 수를 더하면 0이 되는 숫자 즉, 어떤수는 -1이다.
1은 비트로 치면
0 0 0 0 0 0 0 1
여기에 어떤수를 더해서 0이 되게 하려면
1 1 1 1 1 1 1 1
를 더해야 된다.
두개를 더하면
1 | 0 0 0 0 0 0 0 0
넘어가게되서 전부다 0인 상태 0이 된다.
그래서 -1은 모든비트가 다 켜진
1 1 1 1 1 1 1 1
즉 255이다.
0 0 0 0 0 0 1 0
을 반전 시키면
1 1 1 1 1 1 0 1
인데 다 더하면
1 1 1 1 1 1 1 1
이나오게 되어서 뭔가 모자라다.
1 | 0 0 0 0 0 0 0 0
이 되어야 -2인데 말이다...
밑에
트리거로 1만 더해주면 0 이 되니까 -2가 될텐데..
그래서 미리
1을 더해 놓는다.
그러면 이렇게 되서 음수 바로 찾는다.
진짜 -2네?
부호 싹다 반전 시키고 1을 더한다.
메이플 보스몬스터 같은 경우에
체력을 INT로 설정해놓은 경우
MSB 가 1이 되어서 넘어가는 순간 21억이 넘는 순간
signed에서는 최상위 비트가 1이 되는 순간 이것을 음수로 받아들임.
음수로 처리를 하니까 죽어버리는 문제
signed일 경우
최상위 비트가 1이면 어쨋거나 음수인데
이유가 뭐냐면
1 ? ? ? ? ? ? ?
이라도 여기에
0 ? ? ? ? ? ? ?
을 더하면 0이 되는 수가 있을 테니
signed일 경우 음수로 본다.
ex)
signed일 경우
1 0 1 1 1 1 1 1 == -65
이상태인데 실제로 191을 넣고 break Point잡아보면
-65 들어가있다.
있을때
0 1 0 0 0 0 0 1 == 65 -> 2의 보수법으로 구함
그다음 자료형을 정수형, 실수형 나눈 이유랑
실수는 뭔지 알아볼 것이다.