int나 long이나 둘 다 4byte임 <-- 이건 int를 너무 오래쓰다보니까 둘다 4byte가 된 케이스임
정수와 실수는 표현되는 방식 자체가 다르다. <-- 만약 정수와 실수가 혼합된다면 컴퓨터는 둘 중 하나의 연산방식을 반드시 택해야함
만약 int a = 4 + 4.0; 이면? <-- 받는 자료형이 int이기 때문에 4.0이 4(정수)로 형변환 되면서 연산됨
정수, 실수가 막 섞여있으면 굉장히 연산이 비효율적으로 변함, 웬만하면 정수는 정수끼리 실수는 실수끼리
21을 이진수로 표현하면 10101이 됨
그럼 이제 소수는 어떻게 될까? 0.1부터 보자
0.1이 10개 모여야 1의 자리로 감, 이진법에서는 2개만 모여도 1의 자리로 감 --> 그렇다면? 이진법에서는 0.5가 됨
10101.11 <-- 여기서 0.11의 위치에 있는 얘네들은 , 이렇게 됨 (0.5, 0.25...)
따라서 21.8125는 이진법으로 10101.11010이 됨
그런데 소수점은 안쓰니까?, 정규화 하면 소수점이 맨 앞으로 감 <-- 이게 무슨소리냐 하면
저 밀어서 소수점이 된 부분은 가수부, 그리고 2의 5제곱을 나타낸 부분은 지수부가 됨
지수부는 000101 <-- 맨앞은 부호, 그 뒤는 2의 00101제곱, 그리고 가수부는 그대로 1010111010
따라서 00000010110101110100000000000000 <-- 0의 개수가 많은건 신경쓸필요 없음, 아마 공간을 많이 할당해준 것 같음
필요한 부분만 떼서 보기 -->
0001011010111010
= 21.8125의 이진수 표현
부호 (양수가 0) | 지수부 () | 가수부 |
---|---|---|
0 | 00101 | 1010111010 |
아주 근사한 값까지는 도달할 수 있겠지만? 완전히 정확한 수에는 도달하지 못할 수도 있음 (이진법으로 딱 표현이 안된다면) + 표현이 되어도 너무 길게 늘어진다면 공간이 부족해짐 <-- 거기서 오차가 발생함
이것때문에 발생하는 문제는 if문 등을 쓸때 1 + 0.1 == 1.1
이런게 False
로 나올 수가 있음 <-- 이런 문제를 최대한 막기위해서는 float은 거르고 double을 사용
정수는 정수끼리, 실수는 실수끼리 연산하되, 두 표현방식의 피 연산자가 혼합 연산될 경우 명시적으로 변환하자 (내가 의도적으로 이렇게 했다는걸 명시)
ex) float f = 10.2415f + 20;이면? float f = 10.2415f + (float)20; 이렇게 써주기