[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 |
댓글