728x90
- 자료형의 종류
- 정수형 (크기 단위: byte)
char(1), short(2), int(4), long(4), long long(8) - 실수형
float(4), double(8)
* 표현 가능한 수의 크기는 자료형의 Byte 크기에 따라 달라진다.
- 정수형 (크기 단위: byte)
- 실수형 자료형
- 실수형 숫자의 비트 표현은 '부동소수점' 방식을 이용한다.
32bit = 부호비트(1) + 지수비트(8) + 가수비트(23) - 정수표현 방식과 실수표현 방식은 체계가 아예 다르기 때문에 둘을 혼합하여 연산하는 것은 의도하는 경우가 아닌 이상 피하는 것이 좋다.
int a = 4 + 4.0;
위 수식은 4.0의 실수형 값이 4인 정수형으로 '형변환'되어 연산되는 과정이 숨겨져 있다.
따라서 의도적으로 두 표현방식의 피연산자 연산이 필요한 경우엔 명시적인 변환 표현이 필요하다.
int a = 4 + (int)4.0;
float f = 10.2415f + (float)20;
(int), (float) 등의 형 변환을 적지 않아도 해당 연산은 자동으로 일어나지만 명시적으로 표현하는 것이 좋다. - 실수의 표현방식에는 특정 실수에 딱 떨어지는 비트가 존재하지 못할 수도 있기 때문에 해당 실수에 가장 '근사한 비트 값'을 구하게 된다.
* 이러한 경우 발생할 수 있는 문제점
예를 들어 if(x == 1.f)라는 조건문을 작성했을 때, x값이 0.999998f 라는 1에 근사치를 찾았음에도 1로 딱 떨어지는 수치가 아니기 때문에 해당 조건문에 걸리지 않는다는 문제점이 발생하기도 한다.
- 실수형 숫자의 비트 표현은 '부동소수점' 방식을 이용한다.
- 메모리 크기 (단위)
- 1 byte = 8 bit (1bit = 0 or 1)
1 byte는 256개의 수를 표현할 수 있다. - 1 KB = 1024 byte
- 1 MB = 1024 KB
- 1 GB = 1024 MB
- 1 TB = 1024 GB
- 1 TB = 2^40 byte
- 1 byte = 8 bit (1bit = 0 or 1)
- unsigned / signed 자료형
- unsigned는 '양수'로만 수를 표현할 때 사용되는 자료형으로 256개의 수를 표현하는 경우 0~255까지의 수를 의미한다.
ex) 선언 방법: unsigned char c = 0; - signed는 양수와 음수 모두를 표현할 때 사용되며 256개의 수를 표현하는 경우 -128 ~ 127까지의 수를 의미한다.
단, signed는 자료형을 선언할 때 default 값으로 선언되기 때문에 따로 적어주지 않아도 된다.
ex) "signed char c = 0;" == "char c = 0;"
- unsigned는 '양수'로만 수를 표현할 때 사용되는 자료형으로 256개의 수를 표현하는 경우 0~255까지의 수를 의미한다.
- 최상위 비트
- 최상위 비트 (MSB, Most Significant Bit)는 비트 표현에서 가장 앞에 위치한 비트이다.
컴퓨터에 1을 입력한 경우 컴퓨터는 1로 받아들이는 것이 아닌 1이라는 숫자의 비트 값(0000 0001)을 해석한다.
이때 가장 앞에 위치한 비트 '0'000 0001이 최상위 비트이고, 최상위 비트의 '0'은 '양수'를 의미한다.
반대로 최상위 비트가 '1'을 가질 땐 '음수'를 의미한다. -1 비트는 (1111 1111)로 표현할 수 있다.
- 최상위 비트 (MSB, Most Significant Bit)는 비트 표현에서 가장 앞에 위치한 비트이다.
- 비트 표현
- char 자료형은 1byte의 크기를 가지므로 256개의 수를 표현할 수 있다.
char c = 255;
위와 같이 자료형을 선언하고 변수를 초기화한 경우, char형은 -128~127까지의 범위만 표현하므로 틀린 표현이라고 생각하기 쉽다.
그러나 컴퓨터는 이를 255라는 숫자로 인식하지 않고, 255의 값을 가지는 비트로 변형하여 해석하게 된다.
255를 비트로 표현하면 (1111 1111)로 표현되기 때문에 내가 c 변수를 255로 초기화했어도 컴퓨터는 이를 -1로 해석하여 값을 저장하기 때문에 틀린 표현이라고 볼 수 없다. (-1의 비트 표현도 1111 1111이다.)
이와 같이 입력되는 값과 비트로 해석되는 값이 다를 수 있기 때문에 해당 내용을 헷갈리지 않는 것이 중요하다.
- char 자료형은 1byte의 크기를 가지므로 256개의 수를 표현할 수 있다.
- 음수 정수 찾기 (2의 보수법)
- 1단계 - 대응되는 양수의 부호를 반전한다.
2 bit = 0000 0010
반전 ->1111 1101 - 2단계 - 해당 비트에 1을 더한다.
반전 -> 1111 1101
+1
결과 -> 1111 1110 = -2 bit - 3단계 - 검증
해당 비트가 2의 음수가 맞는지 검증하기 위해 두 비트를 더해본다.
0000 0010
+ 1111 1110
= 1 0000 0000
모든 비트가 0이 되므로 (1111 1110)은 -2bit가 맞다. - 음수의 2의 보수 찾기
보통 2의 보수를 취하면 양수 -> 음수를 구하는 경우가 많다.
따라서 갑자기 음수의 2의 보수를 구하려 하면 헷갈리는 경우가 있어 확실하게 공부해둬야 한다.
-47의 2의 보수를 계산해보도록 하자.
2의 보수는 대응되는 양수의 음수 값을 구하기 때문에 '-47'의 2진법이 무엇인지 찾기 위해 47의 2의 보수를 구한다.
47의 2진수 => 0010 1111
반전 => 1101 0000
+1 => 1101 0001 = 47의 2의 보수
-47의 2진수 값을 찾았기 때문에 -47의 2의 보수를 동일한 방법으로 구한다.
-47의 2진수 => 1101 0001
반전 => 0010 1110
+1 => 0010 1111 = -47의 2의 보수
- 1단계 - 대응되는 양수의 부호를 반전한다.
728x90
'📚책읽기' 카테고리의 다른 글
[C/C++] 포인터 변수, 포인터 배열 (0) | 2022.03.07 |
---|---|
[C/C++] 메모리 영역, 변수-2 (정적변수/외부변수), 분할구현 (0) | 2022.03.02 |
[C/C++] 함수, 재귀함수, 배열 (0) | 2022.02.17 |
[C/C++] 변수(지역변수/전역변수), Visual Studio 단축키(주석, 디버그) (0) | 2022.02.17 |
[C/C++] 연산자, #define, 비트연산(Shift) (0) | 2022.02.09 |