Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++에서 정수와 부동 소수점(float)의 할당 및 비교 완벽 이해


정수(Integer)란 무엇인가?

정수(integer)는 양수, 음수, 0처럼 소수 부분이 없는 숫자를 다루는 데이터 타입입니다. 따라서 정수는 소수점을 가질 수 없습니다.

실수(Float)란 무엇인가?

float는 소수 값을 가지는 숫자를 다루는 데이터 타입입니다. 소수점을 포함한 값을 그대로 저장할 수 있습니다.

그렇다면 동일한 값을 정수와 float에 각각 대입했을 때, 컴파일러는 어떤 결과를 반환할까요? 아래 예제를 통해 하나씩 확인해 보겠습니다.

예제 1: 정수 값을 float과 unsigned int에 대입하기

#include <iostream>
using namespace std;
int main(){
    float f = 23;
    unsigned int x = 23;
    cout<<"Float f = "<<f<<endl;
    cout<<"Integer x = "<<x<<endl;
    f = 0xffffffff;
    x = 0xffffffff;
    cout << "f = " << f << endl;
    cout << "x = " << x << endl;
    return 0;
}

실행 결과

Float f = 23
Integer x = 23
f = 4.29497e+09
x = 4294967295

위 코드에서 볼 수 있듯이, 정수 값을 float 변수에 대입하면 해당 값은 정수처럼 취급되어 정수 형태로 출력됩니다. 하지만 주목할 점은 두 타입이 표현할 수 있는 최대값이 서로 다르다는 것입니다. 0xffffffff를 대입했을 때 float은 지수 표기법(4.29497e+09)으로 근사값을 출력하는 반면, unsigned int는 정확한 정수값인 4294967295를 그대로 보여줍니다.

예제 2: float 값을 정수 변수에 대입하기

이번에는 반대로 정수 변수를 소수점이 있는 float 값으로 초기화하면 어떻게 되는지 살펴보겠습니다.

#include <iostream>
using namespace std;
int main(){
    float f = 23.768;
    unsigned int x = 23.768;
    cout<<"Float f = "<<f<<endl;
    cout<<"Integer x = "<<x<<endl;
    return 0;
}

실행 결과

Float f = 23.768
Integer x = 23

이 경우에도 프로그램은 문제없이 컴파일되고 실행됩니다. 다만 정수 변수는 초기화에 사용된 float 값의 소수점 이하를 버리고(절삭) 정수 부분인 23만으로 초기화됩니다. 즉, 반올림이 아니라 잘라내기(truncation)가 일어난다는 점을 기억해야 합니다.

예제 3: float과 정수 값 비교하기

이제 두 타입의 변수에 동일한 값을 넣고 등호(==) 연산자로 비교해 보겠습니다.

#include <iostream>
using namespace std;
int main(){
    float f = 0xffffffff;
    unsigned int x = 0xffffffff;
    if(f == x ){
        cout<<"TRUE";
    }
    else
        cout<<"FALSE";
    return 0;
}

실행 결과

TRUE

비교 결과는 TRUE입니다. float과 정수를 비교할 때 C++는 일반 산술 변환 규칙에 따라 정수 쪽을 float으로 변환한 뒤 비교하기 때문입니다. 0xffffffff를 float으로 변환하면 두 변수 모두 동일한 근사값을 가지게 되므로 두 값은 같다고 판단됩니다.

정리하면, C/C++에서는 서로 다른 숫자 타입 간의 대입과 비교가 자동으로 이루어지지만, 소수점 절삭표현 범위의 차이 때문에 의도치 않은 결과가 발생할 수 있습니다. 따라서 타입 간 변환이 필요할 때는 static_cast 같은 명시적 형변환을 사용하고, 부동 소수점끼리의 직접적인 등호 비교는 가능한 한 피하는 것이 안전한 코딩 습관입니다.