공부중

[C/C++] 정수와 실수의 표현방식 본문

Programing/C, C++

[C/C++] 정수와 실수의 표현방식

곤란 2021. 2. 24. 21:42
반응형

모든 정수의 가장 왼쪽에 있는 비트는 부호비트

0 0 1 1 0 0 0 0
부호비트 데이터

일반적으로 표현하는 singed 변수들은 위와같이 부호비트를 가지게 된다.

하지만 음수의 값을 가지지 않는 unsinged 변수들은 아래와 같이 부호비트도 데이터를 표현하는데 사용되므로 더 넓은 양의숫자를 표현할 수 있다.

0 0 1 1 0 0 0 0
데이터

 

음수를 표현하는 방법

0 0 1 1 0 0 0 0
부호비트 데이터

위의 숫자를 음수로 변경하려고 한다.

부호 비트만 바꾸어 보면

1011 0000 이 된다.

하지만 정수 A가 존재할시 -A를 더할경우에는 0이 되어야 정상이다.  ex) A == 10 , 10 + (-10) = 0

    0011 0000

+  1011 0000

    1100 0000

위와같이 0이 되지 않으므로 음수를 구할때는 아래와 같은 방법으로 구해야 한다.

0011 0000 을 먼저 1의 보수(각 비트의 0과 1을 반전)를 취한다. 

1100 1111 : 0011 0000의 1의 보수 결과값

1100 1111 에서 2의 보수(1의 보수결과값 + 1)를 취한다.

1101 0000 : 0011 0000의 2의 보수 결과값

0011 0000의 음수값은 1101 0000이다.

 

정말 0011 0000의 음수는 1101 0000 인지 확인해보자

    0011 0000

+  1101 0000

 1 0000 0000

맨 앞의 1은 표현범위를 넘어가게 되므로 결과는 0이 되는것을 확인 할 수 있다

그러므로 0011 0000의 음수는 1101 0000 이다.

 

실수의 표현 방식

0 0 1 1 0 0 0 0
부호비트 정수부분(가변) 소숫점 부분(가변)

부호비트를 제외한 나머지 부분에서 정수부분과 소숫점 부분을 적절히 나누어서 표현한다.

부동소수점(浮動小數點)은 부동자세의 부동이 아니다... 

 

실수표현시 생기는 문제

#include <iostream>

int main()
{
	float floatValue = 0.0f;
	for (int i = 0; i < 100; i++)
	{
		floatValue += 0.1f;
		std::cout << fixed;
		std::cout << floatValue << std::endl;
	}

	return 0;
}

출력 결과

컴퓨터는 우리가 표현하고자 하는 실수의 값을 정확하게 표현하는것이 아닌 근사치를 통해서 실수를 표현하기 때문.

반응형