728x90

 


출처:

 

Data Type Ranges

Learn more about: Data Type Ranges

docs.microsoft.com

 

 

Visual Studio 2019 기준

 

유형 이름 크기
(byte)
기타 이름 값의 범위
int 4 signed –2,147,483,648 ~ 2,147,483,647
unsigned int 4 unsigned 0 ~ 4,294,967,295
__int8 1 char -128 ~ 127
unsigned __int8 1 unsigned char 0 ~ 255
__int16 2 short
short int 
signed short int
–32,768 ~ 32,767
unsigned __int16 2 unsigned short 
unsigned short int
0 ~ 65,535
__int32 4 signed, 
signed int, 
int
–2,147,483,648 ~ 2,147,483,647
unsigned __int32 4 unsigned 
unsigned int
0 ~ 4,294,967,295
__int64 8 long long
signed long long
–9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
unsigned __int64 8 unsigned long long 0 ~ 18,446,744,073,709,551,615
bool 1 없음 false or true
char 1 없음 기본적으로-128 ~ 127

(/J로 컴파일한 경우 0에서 255) 
signed char 1 없음 -128 ~ 127
unsigned char 1 없음 0 ~ 255
short 2 short int
signed short int
–32,768 ~ 32,767
unsigned short 2 unsigned short int 0 ~ 65,535
long 4 long int 
signed long int
–2,147,483,648 ~ 2,147,483,647
unsigned long 4 unsigned long int 0 ~ 4,294,967,295
long long 8 없음 (__int64 와 동일 ) –9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
unsigned long long 8 없음
(unsigned __int64와 동일)
0 ~ 18,446,744,073,709,551,615
enum 다름 없음  
float 4 없음 3.4E±38(7개의 자릿수)*
double 8 없음 1.7E±308(15개의 자릿수)*
long double double과 동일 없음 double과 동일
wchar_t 2 __wchar_t 0 ~ 65,535

 

signed  VS  unsigned

  • signed : 부호가 있는
  • unsigned : 부호가 없는 (양수만 표현)

 

지수 표기법

    n E M = n * 10^M 

  • float 와 double의 범위를 보면 숫자가 특이하게 표현되어 있는 것을 볼 수 있습니다.
  • 이는 컴퓨터에서 아주 크거나 작은 수를  표기하는 방식입니다.
  • float의 경우에만 간단히 바꾸어 보자면 아래와 같습니다.
    ->              3.4E±38 = 3.4*10^-38 ~ 3.4*10^38

 

float VS double

  • float와 double 모두 실수를 표현하는 데이터 타입이지만 float가 double 보다 큰 수를 표현 할 수 있는 것을 볼 수 있습니다.
  • 하지만 그만큼 오차가 많으니 더 많은 소수점 자리수를 표현할 수 있는 double의 사용을 권장하고 있습니다.

 

 

 

728x90
728x90


기본 입출력 함수


헤더 파일

#include <iostream>
  • 위의 헤더파일을 반드시 추가해야 사용 가능합니다.
  • cin,cout 모두 std 네임스페이스 내에 존재합니다.

 

 

참고로 아래의 코드를 추가하면 std:: 를 붙이지 않고도 사용할 수 있습니다.

 

 

1.전체 네임스페이스를 std로 선언하는 방식.

이는 추후에 문제가 생길 수 있는 방식이니 초반에만 사용하도록 합니다.

using namespace std;​

 

2. cin,cout에 대해서만 네임스페이스를 지정해주는 방식

이 방식이 좀 더 권장되는 방식입니다. 

(사실 귀찮아서.. 저는 1번도 자주 사용합니다.) 

using std::cin;
using std::cout;

 


std::cin 

 

#include <iostream>	

int main(){
	int num;	//변수 선언
	std::cin >> num;	//변수 입력
}
  • 가장 기본적인 cin의 활용 방식입니다.
  • 백준 저지의 경우라면 입력으로 보여주는 숫자들이 프로그램 흐름상 차례로 변수에 입력되게 됩니다.
  • >> 의 방향에 유의하도록 합시다. 저는 변수에게 집어넣는다고 연상해서 외웠습니다.

std::cout

#include <iostream>

int main(){
	int num;	//변수 선언
	std::cin >> num;	//변수 입력
	std::cout << num;	//변수 출력
}
  • 앞서 cin으로 값을 입력받은 num 변수를 출력하는 모습입니다.
  • cin과 화살표 방향이 반대임을 꼭 유의하도록 합니다.

 

 

-여러개의 변수를 한꺼번에 입출력 시

std::cin >> a >> b;
std::cout << a << b;
    •  너무 횟수가 늘어나는 경우에는 당연히 반복문 등을 활용하도록 합니다.

 

 

 


 

시간 제한 환경에서의 빠른 입출력


 

  • 무턱대고 cin과 cout을 쓰다 보면, 백준 저지등에서 시간초과가 날 수 있습니다. 속도가 아주 느리거든요.
  • 속도가 느린 이유는 저도 자세히는 설명이 어렵지만(잘 모름), 대체로 2가지로 추려볼 수 있습니다.
    1. 타 언어(C나 Java등)와 달리 입출력하는 데이터의 형식을 지정하지 않습니다.(데이터가 int인지, string인지..) 아주 편리하죠.
    2. iostream이 cstdio와 동일한 버퍼 시스템을 사용하기 때문에. (잘 이해가 되지 않으나 printf, scanf등을 모두 호출한다고 함)
  • 그런데, 느리다고 해서 나쁜 걸까?
    • 그렇지는 않습니다. 아래의 방식들은 시간 제한이 있는 코딩테스트 등의 특수한 상황에서의 대처법일 뿐입니다.
    • cin, cout이 나중에 나온 언어이니 만큼 안정성, 확장성 등에서는 더 뛰어나다고 합니다. 

 

 

1.  C의 입출력 사용하기

 

헤더파일

 

#include <stdio.h>	//C의 방식
#include <cstdio>	//C++의 방식
  • stdio.h와 cstdio는 namespace가 다르다곤 하지만.. 다들 취향껏 사용하시는 듯 하니 골라서 쓰시면 됩니다.

 

 

scanf

 

#include <cstdio>

int main()
{
	int num;
	scanf("%d",&num);	//입력
}
  • %d란 무엇일까요?  cin과 달리 printf는 입력받는 데이터의 형식을 지정해 주어야 합니다. 
  • 바로 그 데이터의 형식을 알려주는 문자를 형식지정자 라고 합니다. 
    • 형식지정자에 관해서는 아래의 페이지를 참고 해 주세요! (추가 예정)

 

  • 그렇다면 입력 받는 변수 앞에 &를 붙이는 이유는 무엇일까요? (참고로 &는 코딩 초기에 자주 까먹습니다. 유의하세요.)
  • C에서 포인터를 배웠다면 아시겠지만.. &를 변수 앞에 붙여주면 변수의 메모리 주소라는 의미입니다.
  • 여기서는 num의 메모리 주소로 가서 입력받은 int 데이터를 입력하라는 뜻으로 보면 되겠죠.

 

  • 한번에 여러개의 입력을 받을 때는 아래처럼 사용하면 됩니다.
scanf("%d %d %d",&a,&b,&c);

 


printf

 

#include <cstdio>

int main()
{
	int num;
	scanf("%d",&num);
	printf("%d",num);	//출력
}
  • scanf와 거의 동일한 모양입니다. 다만 변수 앞에 &가 붙지 않음을 유의하세요.
  • scanf와 달리 문자열과 함께 사용할 수 있습니다. 아래와 같습니다.
printf("%d 더하기 %d 는 %d 입니다.\n",a,b,a+b);

 


 

2.  버퍼 동기화 끊기 + untie 

 

버퍼 동기화 끊기

ios_base::sync_with_stdio(false);
  • 앞서 말한 cstdio와 iostream의 버퍼 동기화를 끊어줍니다.
  • 메인 함수 안, 가장 윗줄에 추가하여 사용합니다.
  • 다만, 이걸 사용한 경우에 cin,cout을 사용하면서 printf,scanf를 동시에 사용하는 것은 불가능하니 유의합시다.

 

untie

cin.tie(NULL);
  • cin과 cout의 tie를 풀어줌으로써 속도를 향샹시키는 방식입니다.
    • cin과 cout의 tie의 의미 : 서로의 IO작업 전에 자동으로 버퍼를 비웁니다.
  • 따라서 이 코드를 사용한 경우에는 수동으로 버퍼를 비워줘야 합니다. (대체로 코딩테스트에서는 잘 없음)
  • 마찬가지로 메인 함수 안, 가장 윗줄에 추가하여 사용합니다.

 

 

저는 개인적으로 애초에 아래의 형식을 기본으로 두고 사용하는 편입니다. (대체로 백준에서는 문제 없었음)

#include <iostream>

using namespace std;

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
    
	/*
	TODO
	*/

}

 

728x90
728x90


이스케이프 시퀀스 : Escape Sequence


  • 출력 시에 특별한 제어 기능을 가진 문자열.
  • 언어마다 제공하는 종류가 다르기 때문에, 확인 필요.

 


\ 기호

애플 키보드에서의 역슬래시

키보드에서 대개 엔터 키 바로 위에 있는 버튼입니다.

역슬래시 모양과 W에 가로로 줄을 그은 두가지 모양 모두 같은 기호입니다.

 

 

 


C++의 이스케이프 시퀀스

문자열 의미
\a 경보 문자
\b 백스페이스
\f 폼 피드(form feed)
\n 개행
\r 캐리지 리턴 ( carriage return )
\t 수평 탭
\v 수직 탭
\\ 백슬래시 출력
\' 작은따옴표 출력
\" 쌍따옴표 출력
\ooo 8진수 값 아스키 코드 표현
\xhh 16진수 값 아스키 코드 표현

폼 피드, 캐리지 리턴

  • 출력 장치 제어 문자
  • 폼 피드 : 한 페이지 넘겨서 출력.
  • 캐리지 리턴 : 캐리지 리턴 문자 뒷 부분만 출력.

*예시

cout << "Hello\rHi";

: 해당 코드는 Hi 를 출력합니다. 

 

  • 일정 크기(스페이스 바 4번) 만큼 띄워서 출력.

 

출력

  • 작은 따옴표, 쌍 따옴표는 사용 시에 컴파일러가 문자열의 시작이나 끝으로 인식합니다.
  • '\'도 마찬가지로 이스케이프 문자로 인식합니다. 
  • 따라서 해당 문자들을 출력하기 위해서 앞에 \를 붙여줍니다.

 

아스키코드 표현

  • \ 뒤에 3자리 단위의 8진수나 16진수의 아스키 코드 값을 넣어 해당 아스키 코드를 출력하는 방식.

아스키 코드표

*예시

cout << "아스키 코드로 02B 는 \02B";

: 해당 코드는 아스키 코드로 02B는 + 를 출력합니다. 

 

728x90

+ Recent posts