공부중
[C/C++] 정수와 실수의 표현방식 본문
모든 정수의 가장 왼쪽에 있는 비트는 부호비트
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;
}
출력 결과
컴퓨터는 우리가 표현하고자 하는 실수의 값을 정확하게 표현하는것이 아닌 근사치를 통해서 실수를 표현하기 때문.
'Programing > C, C++' 카테고리의 다른 글
[C/C++] 구조체의 크기 (0) | 2021.03.15 |
---|---|
[C/C++] 자료형의 크기에 대하여.. (0) | 2021.02.24 |
[C++] 전위/후위 증가/감소 연산자 (0) | 2020.11.18 |
[C++] Lvalue Rvalue (0) | 2020.11.17 |
[C/C++] Right to Left Rules(오른쪽-왼쪽 규칙) (1) | 2020.11.14 |