본문 바로가기

2023 c++

23년 C++ chap3(4) 표현식과 문장 -> 오버플로우,언더플로우 / 데이터 형식 조정

04 오버플로우, 언더플로우

1 오버플로우와 언더플로우

-오버플로우: 자료형의 최대값보다 큰 값을 저장하려고 할 때 발생하는 문제

-언더플로우: 자료형의 최소값보다 작은 값을 저장하려고 할 때 발생하는 문제

 

*C++은 오버플로우와 언더플로우에 대해서 오류메세지를 생성하지 않음

 

2 정수 / 부동 소수점의 오버플로우와 언더플로우

-정수는 오버플로우와 언더플로우가 발생할 때, 범위를 한 바퀴 도는 현상이 있음

-부동 소수점은 그러한 현상이 없음

ㄴ> 대신 오버플로우는 양의 무한대로 수렴, 언더플로우는 음의 무한대로 수렴함

 

*double 자료형의 오버플로우와 언더플로우를 확인해보자

#include <iostream>
// 시스템마다 최소, 최대값이 다르므로 라이브러리를 사용해서 초기화함
#include <limits> 
using namespace std;

int main()
{
    // double 자료형의 최대값과 최소값 검색
    double num1 = +numeric_limits<double>::max();
    double num2 = -numeric_limits<double>::max();
    //double 자료형의 최대값과 최소값 출력
    cout << "double의 최대값: " << num1 << endl;
    cout << "double의 최소값: " << num2 << endl;
    // 값에 1000.00 곱하기
    num1 *= 1000.00;
    num2 *= 1000.00;
    // 오버플로우와 언더플로우된 값 출력
    cout << "오버플로우가 일어난 num1 * 1000의 값: " << num1 << endl;
    cout << "오버플로우가 일어난 num2 * 1000의 값: " << num2 << endl;
    return 0;
}

출력 결과

05 데이터 형식 조정

-상황에 따라 입출력 형식을 바꿔야 할 때 조정자라는 객체를 사용한다

 

1 출력 조정자

-삽입 연산자에 출력 조정자를  전달하면 출력 형식을 조정할 수 있다

-출력 조정자는 매개변수 없는 조정자와 있는 조정자로 구분

 

-매개변수 없는 조정자

ㄴ> <iostream>에 포함돼있음

ㄴ> endl을 제외한 모든 조정자는 출력 스트림의 상태를 변경 -> 즉, 1회만 지정하면 계속 적용

 

   -1 endl 조정자

 

   -2 불 리터럴 조정자(noboolalpha, boolalpha)

   ㄴ> noboolalpha: 불 값을 정수(0 OR 1)로 출력

          boolalpha: 불 값을 리터럴(false OR true)로 출력

   

   -3 그 외 등등(dec,oct,hex,noshow/showbase,fixed,scientific,showpoint,showpos,uppercase,left,internal,right)

 

-매개변수 있는 조정자

ㄴ> <iomanip> 헤더를 읽어들여야 함

 

   -1 setprecision(n) 조정자: n으로 소수점 뒤의 몇 자리까지 출력할지 지정한다(고정 소수점 출력 방식에서만 사용)

 

   -2 setw(n) 조정자: n으로 전체 필드 크기를 지정한다(고정 소수점 출력 방식에서만 사용)

  

   -3 setfill(ch) 조정자: 필드의 크기가 실제 출력 내용보다 클 때 발생하는 패딩을 어떤 문자로 채울지 지정한다

 

2 입력 조정자

   -1 불 리터럴 조정자(noboolalpha, boolalpha)

   ㄴ> boolalpha: 불을 0,1이 아닌 false, true로 입력할 수 있는 조정자 (<-> noboolalpha는 기본값: 0,1로 입력)

 

   -2 진법 변경 조정자(dec, oct, hex)

   ㄴ> 정수를 8진수와 16진수로 입력할 수 있는 조정자