Cpp 기초 : 자료형 - 숫자형 - 정수 (1)
Integer Type / 정수형
프로그래밍에서 정수(integer)는 소수점이 없는 숫자를 의미한다.
정수는 양수, 음수 또는 0일 수 있다.
3.0은 실수이지 정수가 아니다. 정수는 3으로 깔끔하게 표현되어야 하기 때문이다.
C/C++에서 정수는 short/int/long 등으로 세분화 할 수 있는데, 각 종류마다 표현 가능한 숫자의 범위나 잡아먹는 데이터 용량이 다르다. 여기서 말하는 short/int/long 등은 type specifier, 우리말로 형식 지정자라고 부른다.
정수 안에서도 어떻게 세분화 되고 뭐가 다른지는 차근 차근 더 자세히 설명하겠지만. 간단히 예만 들어보겠다.
예를 들어 정수형은 int가 디폴트인데. int는 32 비트 (= 4바이트) 이다.
int a = 3; 이라고 선언했을 때, a는 4바이트만큼의 공간을 요구하는 것이다. 그리고 a는 최대 2,147,483,647 까지만 표현이 가능하다. 2,147,483,648 이란 숫자 이상은 나타낼 수 없다.
Type Specifier란?
말 그대로 변수 또는 함수 선언의 형식을 정의한다.
signed char, signed int, signed short int 및 signed long int 형식은 해당 unsigned 대응 항목 및 enum과 함께 정수 형식으로 호출된다. 이 형식이 무엇이냐에 따라서 자료 크기와 정수 표현 범위 등이 달라진다.
자료 크기란?
"int는 4바이트다". 이게 무슨 소리일까?
C++를 공부하다 보면 자료 크기에 관한 말을 계속 보게 될 것이다.
비트의 크기란 : 해당 자료형이 표현할 수 있는 최대/최소 정수값이다.
위에서 int a는 32비트라고 했는데, int이기 때문에 32비트인거지 정수라고 다 32비트가아니다.
심지어 int에서도 더 세분화된다. int는 LP32의 경우엔 16비트고 나머지 3가지 경우엔 32비트이며, shorts의 경우 4개 모든 모델에서 16비트다.
정수는 다음과 같이 세분화 되어 비트수를 구분할 수 있다.
- type specifier에 따라 shorts/int/long/signed 인지
- data model에 따라 LP32/ILP32/LLP64/LP64 인지
아직 이 표가 무슨 소리인지 잘 모르겠지만, 점차 내용이 익숙해 질 것이다.
정수 Data Model 에 따라 세분화하기
LP32/ILP32/LLP64/LP64란 데이터 모델을 의미한다고 했다. 각 데이터 모델은 int/ long/ point 사이즈를 가지고있다.
bit System | model | int | long | ptr | system / api |
32 bit system | LP32 | 2 | 4 | 4 | win16 API |
ILP32 | 4 | 4 | 4 | win32 API, unix and unix like systems (linux, mac) | |
64 bit system | LLP64 | 4 | 4 | 8 | win64 API |
LP64 | 4 | 8 | 8 | unix and unix like systems (linux, mac) |
만약 64비트 윈도우에서 돌렸음에도 불구하고 448 말고 다른 값이 나온면 IDE 빌드 옵션을 확인하자. (x86인지 x64인지)
그런데, 이렇게 환경마다 사이즈가 다를 수 있다는 사실이 불편하긴하다. 내가 개발한 환경에선 롱사이즈가 4였는데 돌아가는 플랫폼에서의 롱사이즈가 8바이트라면, 결과가 전혀 다르게 나올 수도 있다니.. ㅠㅠ.
(암호화 등 사이즈에 민감한 라이브러리 등이 있다).
이런 경우엔 fixed_width를 사용하는 자료형으로 선언해주면 된다.
이렇게 선언하면 어느 플랫폼을 가던 124가 뜬다.
정수 Type Specifier에 따라 세분화하기
signed / unsigned:
말 그대로, 부호가 있고 없음을 의미한다. unsigned는 음수를 표현할 수 없다.
signed는 명시가 필요없다. signed int나 int나 같은 뜻이고 signed short나 short나 같은 뜻이다.
반대로 unsigned는 명시가 필요하다. 예: unsigned int a = 3라고 해야지, 부호 없는 정수를 의미한다.
정수형에서 디폴트는 int라서, (short/long 말고) int라는 말은 생략이 가능하다.
signed라고 하면 signed int. unsigned라고 하면 unsigend int로 컴퓨터가 알아듣는다.
하지만, 그렇다고해서 signed와 int 모두를 생략하여 공백으로 두지는 말자 ^^;;
short / long
만약에 디폴트 int (4바이트) 말고 더 긴 표현 (long) 혹은 더 작은 표현 (short)라고 하려면 별도 명시를 해야한다.
예: long a = 3; short a = 3;
int와 마찬가지로 signed는 별도 명시가 필요없다. signed short = short.
short나 long은 정수를 의미하므로 short int라고 하나 short라고 하나 같은 의미이다.
*롱롱은 c++11에서 처음 나왔는데, 4개 모델 모두에서 64비트다.
그냥 long은 LP64모델에서만 64비트고 나머지 3개 모델에선 32비트다.