본문 바로가기
공부/C, C++

[C] 자료형 (정수형, 실수형)

by 김샤랑 2021. 12. 23.

[C]  자료형 ( 정수형, 실수형)


 


int i = 0;

int : 자료형

i: 변수


- 자료형?

변수 하나를 선언할 때 이 변수가 어떠한 자료의 형태를 나타내는지 설명해주는 역할이 자료형이다.

자료형은 크게 정수형과 실수형 자료형으로 나뉜다.

 

위에서 int i는 i는 정수형 형태의 변수라는 것을 알 수 있다.

-> 그런데 자료형의 종류가 왜 이리 많을까? -> 사이즈의 차이이다.

 

같은 정수형이라도 어떤 자료형인지에 따라 크기가 달라진다.

 

자료형(크기 단위, byte)
정수형: char(1), short(2), int(4), long(4), long long(8)
실수형: float(4), double(8)

다시 맨 위의 코드를 보면 변수의 크기는 4 byte, 정수형 데이터가 저장될 i라는 변수를 만든다는 뜻이다.


- 단위와 범위?

1 byte = 8 bit

1 KB = 1024 byte

1 MB = 1024 KB

 

1 byte로 양수만 표현 경우의 수는 256 가지 수 (수의 범위)

숫자는 0 ~ 255까지 표현 가능 (정수)

unsigned : 양수만 내포하는 자료형 (0 ~ 255)

 


unsigned char c = 0;

c=0;
c=255;  // 255가 뜬다. 1111 1111
c=256;  // <=?? 사이즈가 1 byte이기 때문에 256은 들어갈 수 없다. 0(1 0000 0000)으로 보임.

 

1 byte로 양수, 음수 둘 다 표현

-128 ~ 0 ~ 127

8bit를 7bit에만 수를 배치하고 맨 앞 bit는 0일 경우 1일 경우로 나눠서 128가지 수가 된다.

맨 앞 bit(MSB: most significant bit, 최상위 부호 비트)가 1일 경우를 음수로 판단, 0일 경우 양수로 판단.

 

0000 0001 => 1

1000 0001 =>  -1이 아니다!!!


- 음수 구하기

컴퓨터에서 뺄셈은 음수의 덧셈으로 계산한다. => 10에서 무언가를 더해서 0이 나온다면, 무언가를 -10으로 간주한다.

 

  0111 1111 -> 127이다. 그러면 이 127과 무엇을 더해서 0이 나오게 한다면, 무엇이 -127일 것이다.

  1000 0001을 더하면?

1 0000 0000  -> 0이 나왔다!(맨 앞의 1은 초과해서 잘리기 때문) -> 1000 0001 이 -127이다. 

 


char c1 = 0;
c1 = 255;   // c1의 범위는 -128~127인데 255(1111 1111)를 넣으면  c1의 값은 무엇일까? => c1에는 -1(1111 1111) 이 들어있다.

 


c와 c1 메모리 비트 값은 동일한 상태다 (1111 1111) 하지만 c는 양수(unsigned), c1는 음수, 양수를 다 표현하고자 했다. 

c 관점에서 비트 값은 255,

c1 음수의 관점에서 저 비트 값은 -1이다.

 

동일한 메모리 값이어도 어떻게 해석을 하느냐에 따라 우리가 전혀 다르게 이해할 수 있다. => 추후 포인터와 연관

 



unsigned char c = 0;
c = -1  // 디버그하면 255가 나온다.

- 음의 정수 찾기 (2의 보수법)

대응되는 양수의 부호를 반전 후, 1을 더한다.

 


- 실수형 자료형

정수형과 실수형을 구분 하는 이유는 둘의 데이터를 처리하는 방식 자체가 완전히 다르기 때문이다. 

정수형은 byte 크기에 따라 bit를 채워가며 수를 표현한다.

그런데 실수는 0에서 1 사이만 하더라도 무한개의 수를 만들어낼 수 있다. 즉 무한대로 수를 늘릴 수 있는데 이걸 컴퓨터가 비트로 다 설정할 수 있을까? 노. 

 

=> 따라서 컴퓨터에서 실수를 표현하기 위해 '부동소수점'이라는 표현 체계를 따른다.


- 부동소수점 방식

실수를 컴퓨터상에서 근사하여 표현할 때 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적는 것

출처: 부동소수점 위키백과

 

컴퓨터는 실수에서의 계산을 근삿값으로 표현한다.

실수는 명시적으로 된 값이 아니기 때문에 버그가 있을 수 있다. 

실수 표현 방식은 정밀도에 의존한다.

따라서 double(8) 자료형이 float(4) 보다 더 아래의 소수점까지 정확하게 표현이 가능하다.

 


int a = 4 + 4.0;

 

4와 4.0을 연산할 때는 결괏값이 정수인지 실수인지 결정해줘야 한다. 이 구문에서는 int를 썼으므로 정수로 결과를 저장하는 것을 선택. 계산 과정 속에서는 4+4.0은 실수 체계 표현에서 정수체계 표현으로 형 변환을 한 뒤에 계산한다.

 

=> 정수는 정수끼리, 실수는 실수끼리 연산하되, 두 표현방식의 피 연산자가 연산될 경우 명시적으로 변환해주자.

 


// 예시
float f = 10.2415 f + (float) 20;

 

 

'공부 > C, C++' 카테고리의 다른 글

[C] 비교 연산자, if else 구문  (0) 2021.12.28
[C] 논리 연산자  (0) 2021.12.26
[C] 증감 연산자  (0) 2021.12.26
[C] 산술 연산자  (0) 2021.12.26
[C++] 왜 c++을 쓰는가?  (0) 2021.12.23

댓글