C++에서 자료형은 크게 정수형과 실수형으로 나눌수 있다
먼저 정수형의 대표적인 자료형은 char,int,long,long이 있다.
각각 char = 1byte, integer = 4byte, long = 4byte, longlong = 8byte의 크기를 갖는다.
실수형의 대표적인 자료형은 float, double이 있고
각각 float = 4byte, double = 8byte의 크기를 갖는다.
여기서 알아둬야하는 중요한 포인트는 1byte = 8bit라는 것이다.
bit는 0,1을 나타낼수있는 데이터의 최소 단위이다. 즉 1bit는 0,1 총 2가지의 경우의 수를 나타낼수있고
2bit는 00,01,10,11등 4가지의 경우의 수를 나타낼 수 있게 되는것이다.
3비트는 000,001,010,011,100,101,110,111등 총 8가지의 경우의 수를 나타낼수 있게 된다는 사실이다.
즉 bit의 경우의 수를 구하는 공식은 2^n 라는것을 알수 있다.
그렇다면 8bit는 몇가지 경우의 수를 나타낼 수 있을까? 정답은 2^8 = 256가지의 경우의 수를 나타낼 수 있다.
1byte = 256가지의 경우의 수를 나타낼수 있다는 사실을 알게되었을 것이다. 컴퓨터는 우리가 사용하는 숫자를 2진수로 나타낸다. 예를 들어 우리가 1이라는 숫자를 저장하기위해 char 변수 A를 생성해서 1이라는 숫자를 할당했다고 하자.
이경우 char A에 할당된 메모리의 값은 8bit로 아래 그림처럼 00000001이 될것이다. 이는 2진수로 1을 의미한다.
이처럼 char A라는 변수를 우리가 선언함으로써 컴퓨터 메모리 공간 어딘가의 8bit공간이 생기고 그 공간을 활용하여 우리가 원하는 숫자를 저장하고 꺼내올수 있게 되는것이다. 즉 char은 8bit이므로 2진수 11111111 = 255까지의 수를 나타낼 수 있는것이다. 그렇다면 만약 우리가 char A 에 최대값인 255를 넣게되면 어떤 값이 나오게 될까?
255가 나올줄 알았으나 왠걸? -1이라는 숫자가 나오게 된것을 볼 수 있을 것이다. 그이유를 알기 위해서 우리는 컴퓨터가어떠한 수를 구분을 할때 양수와 음수를 따로 구분한다는 것을 알아야한다.
위 그림처럼 8개의 bit를 가진 자료형 char에서 맨 앞에 있는 비트를 우리는 부호비트 혹은 MSB(Most Significant Bit) 즉 최상위 비트라고 부른다. 이 맨 앞에 있는 비트가 0이냐 1이냐에 따라 0이면 양수, 1이면 음수로 구분하게 되고 맨앞에 있는 비트는 msb를 제외한 bit의 갯수인 7개가 즉 수를 표현하는 실질적인 데이터 공간이라고 보면된다. 2^7 = 128가지의 경우의 수를 나타낼수 있다. 앞서 우리가 선언한 char A는 아래 사진처럼 앞에는 singned가 생략된 형태이다
즉 char A가 나타낼수 있는 값의 범위는 -128 ~ 0 ~ 127까지의 수를 나타낼수 있는것이다. 그렇기 때문에 값의 범위를 벗어나서 원하는 값인 255가 들어가지 않게되는것이다. 그렇다면 왜 -1이라는 수가 들어가게 된것일까? 그것을 알기 위해서는
cpu에서 음수를 연산하는 방식에 대해 알 필요가 있다. 컴퓨터에서 음수 -1은 어떻게 표시할것 같은가? 00000001 = 1이기 때문에 단순히 부호 비트의 값만 바꿔서 10000001 = -1 이라고 생각할 수 있지만 정답은 그렇지 않다.
컴퓨터에서 음수를 데이터로 표현할때 방식은 조금 독특하게 연산하는데 해당하는 수와 서로 더해서 0이되는 수를 음수 값으로 본다. 즉 -1을 예로 들자면 2진수 1과 더해서 0이되는 2진수 값이 -1이 되는것이다.
즉 위에 그림처럼 2진수 00000001 + 11111111 = 100000000 으로 해당 8bit의 공간의 모든 자리의 수를 0으로 만들어주는 11111111이 = -1이 된다. 해당하는 수의 음수를 알아내는 방법은 2의 보수법을 통해 쉽게 알수있다.
임의의 숫자 -38의 데이터 표현 방식은 어떻게 될까? 2의 보수법을 통해 빠르게 구해보자
먼저 38은 2진수로 00100110으로 나타낼수 있다 이후 0은 1로 1은 0으로 반전 시켜주면
11011001 이라는 수가 나오게 되는데 거기에 +1만 해주면 음수 -38의 값이 나오게된다.
따라서 -38은 11011010이 되는것이다.
앞서 얘기했던 2진수 1의 경우도 동일하게 적용하면 빠르게 -1의 데이터 값을 찾을수 있다.
1 = 00000001 이므로 반전시키면 11111110이 되고 이후 1을 더하면 11111111이 되어 -1의 값을 바로 알수있다.
본론으로 넘어가 char 255가 왜 -1이라는 값을 가지게 되었냐면 255를 2진수로 표현하면 = 11111111이 된다.
앞서 자료형 char은 사실 signed가 생략된 데이터 타입으로 8bit중 msb를 제외한 7bit의 값으로만 계산한다는것을 이해했을 것이다. 즉 11111111이라는 수는 자료형 char입장에서는 msb의 부호값이 1이기 때문에 11111111을 음수로 계산방식으로 받아들이게 되어 -1로 인식하는것이다.
2진수 11111111 = 255지만, 최대 8bit값까지만 나타낼수 있는 signed char에서는 맨앞자리 1을 부호비트로 인식하여 -1로 인식하는 것이다. 여기서 굉장히 중요한 사실은 같은 데이터 라도 어떠한 데이터방식으로 저장되냐에따라 전혀 다른 값으로 인식한다는 점이다.
즉, 11111111은 어떠한 데이터 타입(자료형)이냐에 따라 255 혹은 -1이 될수 있는 것이다.
signed형식으로 맨 앞비트를 부호비트로 사용하게 되면 -1로 읽게되고.
unsinged형식으로 부호비트 없이 8bit 모두 사용하게되면 255로 읽게되는 것이다.
여기서 한발 더 나아가 256을 넣으면 어떠한 값이 나올것 같은가?
0이라는 값이 들어가 있음을 알수 있다 256은 100000000으로 8bit의 범위 값을 벗어났기때문에 뒤에있는 00000000만
인식하게되어 값이 0이 된것이다. 257을 넣게되면 몇이 나올까? 257 = 100000001로 마찬가지로 8bit의 범위 값을 벗어나 00000001이라는 값만 컴퓨터에서 인식하게되어 1이라는 값이 들어간것을 확인할 수 있을 것이다.
이처럼 같은 숫자(데이터)일지라도 어떠한 자료형(DataType)으로 저장되냐에 따라 천차 만별이 될수 있음을 명심하고
적절한 크기의 자료형으로 변수를 사용하도록하자.
'C++' 카테고리의 다른 글
C++ 비트 연산자 (&, |, ^, ~) (2) | 2023.11.04 |
---|---|
C++ 비트 연산(시프트 연산) (0) | 2023.11.04 |
C++ 실수 표현 방식 (0) | 2023.11.03 |
비주얼 스튜디오에서 C++ 프로젝트 생성하는 법 (0) | 2023.11.02 |
게임 개발에서 C++이 중요한 이유 (0) | 2023.11.02 |