다시한번 복습하자!!!
어라? "근데 왜 int가 2byte지?" 라고 생각할 수 있는 사람들이 있다. 나도 그렇게 생각했었다. C언어를 배울때에는 int형은 4byte라고만 알고있었는데, 왜 여기선 다를까 하고 고민했던 적이 있다. 여담으로 전자과에서 임베디드 과목을 공부하여 MCU를 다루는 프로그래밍을 하는데 그때 사용하는 언어가 C언어이다. 그때 int형은 2바이트였고 long이 4byte이고.. 많이 헷갈렸었다. 지금은 익숙하지만,,, 하지만 최소 크기가 2byte인거지 대부분의 OS와 Compiler는 4byte로 작동하니 여기서 int형은 4byte라고 알면 될듯하다.
첫 비트는 부호에 사용된다. 따라서 int형을 사용할때 우리가 사용할 수 있는 데이터의 크기는 31bit이다.
#include <iostream>
int main(void)
{
using namespace std;
short s = 1;
int i = 1;
long l = 1;
long long ll = 1;
cout << sizeof(short) << endl;
cout << sizeof(int) << endl;
cout << sizeof(long) << endl;
cout << sizeof(long long) << endl;
return 0;
}
output : 2
4
4
8
위의 코드는 전 시간에 배운 것을 복습했다고 생각하면 될듯 하다. 자료형의 크기를 출력하는 코드이다.
#include <iostream>
#include <cmath>
int main(void)
{
using namespace std;
short s = 1;
cout << std::pow(2, sizeof(short) * 8) << endl;
return 0;
}
output : 65536
여기선 뭔가 색다르긴하다. #include
를 이용하여 cmath
라는 헤더파일을 불러오는데 cmath
안에 있는 pow()를 사용하여 제곱한 값을 출력해 볼 것이다.
std::pow(x,y)
이처럼 계산이 됩니다. 따라서 65536이 출력된다.
그렇다면 signed를 넣어 최대 수를 출력하면 어떻게 될까?
#include <iostream>
#include <cmath>
#include <limits>
int main(void)
{
using namespace std;
short s = 1;
cout << std::pow(2, sizeof(short) * 8 - 1) - 1 << endl;
cout << std::numeric_limits<short>::max() << endl;
cout << std::numeric_limits<short>::min() << endl;
cout << std::numeric_limits<short>::lowest() << endl;
return 0;
}
output : 32767
32767
-32768
-32768
갑자기 또 #include <limits>
가 나와서 머리가 아파질 수가 있는데, 좀더 친근해지라는 의미인듯 싶다. 우리가 직접 계산한 것과 Compiler가 계산한 값과 비교하려면 헤더파일을 이용하여 함수를 갖고오는 것이 좋다. 그렇게 한 결과 동일한 결과가 나오는 것을 볼 수 있다.
여기서 첫 출력이 32767인 이유는 첫 bit가 부호 bit여서 빼고 0을 제외하여 32767이 나오게 된 것이다.이를 함수를 이용하여 구해보면 똑같은 값이 나오는 것을 확인할 수 있다. 음수일 경우는 0을 포함하여 구하기 때문에 -32768로 계산되어 지는 것을 볼 수 있다.
뭐 다 필요없고 여기서 제일 중요한 것은 자료형 마다 갖을 수 있는 '한도'가 있다 라는 것을 알고 있어야 한다. 왜 알아야 하는가? 이 코드를 보면 이해할 수 있다.
#include <iostream>
#include <cmath>
#include <limits>
int main(void)
{
using namespace std;
short s = 32767;
s = s + 1; //32768
cout << s << endl;
return 0;
}
output : -32768
??? 뭐지?? 왜 32768이 나오지 않고 -32768이 나오는 걸까? 라고 생각할 수 있다. short가 갖고 있는 크기를 넘어섰기 때문이다. 이 코드에 s+2를 넣으면 -32767이 나오게 된다. 즉 short가 갖을 수 있는 범위에서 계속 돌게 된다. 이러한 오류를 범하지 않으려면 각 자료형이 갖을 수 있는 크기와 수를 제대로 알고 있어야 한다. 이를 오버플로우라고 한다.