C++프로그래밍/C 와 C++ 기초실습

bool과 부동소수점

season97 2024. 9. 15. 20:27

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로

C++에 대한 구체적인 정보를 담고 있지 않습니다.

 

▶ bool 불리언.

 

ㆍ 참 /  거짓

 

ㆍ 사실 bool은 그냥 1바이트 정수에 불과하다.... 일리가 있는 말인게 아셈블리에서 bool이라는건 없다.

 

ㆍ 그럼왜있지?? -> 가독성이 좋다

int main()
{
	int man = 1;
    bool girl = false;
    
    if(man == 1)
    {
    // 어쩌구저쩌구
    }
    
    if (girl == false)
    {
    // 어쩌구저쩌구
    }

}

ㆍ 가독성의 차이가 크다

 

bool은 1바이트 정수이다 (8bit)

더보기

음... 왜 굳이 1비트로 안하고 1byte로 잡았을까??
우리가 어셈블리를 할때도 al... 1바이트였다
어셈블리에서도 최소단위는 1바이트기 때문에 1바이트로 쓴다.

 

※그래서 비트단위와 비트연산으로 가벼운거 처리하는게 좋다는거같다?? 비트플래그

 


▶ 부동 소수점 (실수)

ㆍ float , double

 

ㆍ float 는 4바이트 = 32비트 = DWORD

float attackSpeed = -3.375f;  //4byte
// f를 붙혀야 float가 되고 안붙히면 (double)로 내부적으로 되고있다.

double attackSpeed2 = 123.4123; //8byte

ㆍ 어셈블리 처럼 디버그를 돌려 주소를 확인해 볼 수 있다

ㆍ 메모리창은 위 방법으로 열면된다

ㆍ 바로 아래 어셈블리도 확인해 볼 수 있는 창이 있다!

 

 

 

※ float는 이 32비트를 어떻게 사용해서 실수를 표현하는 것일까?

더보기

16자리 . 16자리...? 이건 좀 비효율적인것 같다. 

표현 범위가 (0~65535) . (0~65535) 이거밖에 안된다. 매우비효율

 

실제 표현 방법은 부동소수점이다!
.을 유동적으로 움직여서 표현하는 방법
3.1415926535
3.1415926535 = 3.1415926535 * 10 = 313.15926535 * 10^-2

1) 정규화 = 0.31415926535 * 10
2) 31415926535 (유효숫자) 1 (지수)

float같은 경우엔 +-부호(1bit) 지수(8bit) 유효숫자(23bit) 비트를 사용 = 32비트 = 4바이트
double같은 경우엔 +-부호(1bit) 지수(11bit) 유효숫자(52bit) 비트를 사용 = 64비트 = 8바이트

 

-실 예시-

ㆍ -3.375라는 값을 저장하려면?
 1) 2진수 변환 = (3) + (0.375) = 0b11 +
 0.375 = 0.5 * 0 +0.25 * 1 + 0.125 * 1 = 0b0.011
 2) 정규화 0b1.1011 * 2^1
 1(부호) 1(지수) 1011(유효숫자)
 단 지수는 unsigned byte 라고 가정하고 숫자에 +127 만들어줌
 예상 결과 : 0b 1 10000000 1011000'0000'0000'0000'0000

ㆍ 좀 어려운 말이다... 내부적으로 다 처리해주지만 알아두자

 

 

 

 

◆ 결론

 

ㆍ 프로그래밍을 할 때 부동소수점 (실수) 는 항상 "근사값" 이라는 것을 기억하자.

ㆍ 수가 커질수록 오차 범위도 커진다. 

ㆍ 실수 2개를 == 로 비교하는건 위험하므로 지양하자