정수형
가장 기본적인 데이터 타입
정수 저장
자료형 | 바이트 수 | 범위 |
short | 2 | -32768 ~ 32767 |
int | 4 | -2147483648 ~ 2147483647 |
long | 4 | -2147483648 ~ 2147483647 |
unsigned short | 2 | 0 ~ 65535 |
unsigned int | 4 | 0 ~ 4294967295 |
unsigned long | 4 | 0 ~ 4294967295 |
정수형이 여러 개 있는 이유: 용도에 따라 선택해서 사용 (메모리 공간을 줄여야 한다면 short, 큰 값을 사용해야한다면 long)
unsigned: 음수가 아닌 값만을 나타낸다.
signed: 음수도 가능, 위의 int는 signed이 생략되어 있다고 봐도 된다.
unsigned는 부호를 나타냈던 최상위 비트가 값을 나타내는 비트로 사용되기 때문에 표현할 수 있는 양수의 범위가 2배가 된다.
int형이 나타낼 수 있는 정수의 범위
- int형이 몇 비트로 표현되느냐에 따라 달라진다.
컴퓨터 아키텍처: 컴퓨터 시스템의 구조와 동작 방식을 정의하는 개념적인 프레임워크. 하드웨어 및 소프트웨어 간의 상호 작용을 설계하고 조직화하는 원칙과 규칙들의 모음 (예) 데이터 표현 방식, 주소 지정 방법, 입출력 장치 등
컴퓨터 아키텍처에서 사용되는 비트 수는 해당 아키텍처의 데이터 버스와 레지스터 크기에 영향을 받는다.
여러 이유로 데이터를 처리하는 단위가 특정 비트 수로 정의되어 있는데, 이에 따라 CPU가 처리할 수 있는 데이터의 최대 크기를 나타내는 데이터 버스와 레지스터 크기가 결정된다.
32비트 CPU에서는 데이터 버스와 레지스터가 32비트 크기를 갖기 때문에 한 번에 32비트의 데이터를 처리할 수 있다.
따라서 int형도 32비트 크기를 가지게 된다.
(내부 처리가 32비트인 컴퓨터는 CPU에서 처리하는 제일 빠른 비트 수가 32비트이므로 int형을 32비트로 놓는다.)
64비트 CPU를 사용할 경우, int형이 64비트가 될 수 있다.
하지만 주로 그렇다는 것이지 절대적인 규칙은 아니며, 언어나 컴파일러에 따라 달라질 수는 있다.
int형이 32비트인 경우, int형이 표현할 수 있는 정수의 범위
-2^31 ~ 2^32-1 (-2147483648 ~ 2147483648)
short형은 16비트이므로
-2^15 ~ 2^15-1 (-32768 ~ 32768)
내부적인 정수 표현 방식 (2의 보수)
부호비트가 0이면 양의 정수, 1이면 음의 정수이다.
양의 정수의 경우 10진수를 2진수로만 바꾸어 메모리에 저장하면 된다.
+3 이면 메모리에 0000 0011로 저장된다.
하지만 음의 정수, -3 일 경우 1000 0011 일까?
이런 식으로 음의 정수를 표현하게 될 경우, 컴퓨터 내부에서 사용하기 불편하다.
CPU내부에선 CPU의 복잡도를 줄이기 위해 뺄셈을 할 때 덧셈을 사용한다
3 - 3 => 3 + (-3)
위의 두 +3과 -3의 이진수를 더하게 되면
1000 0110로 -6이 나온다.
이걸 해결하기 위해
2의 보수라는 방법을 사용한다.
-3를 2의 보수로 표현해보자
먼저 부호를 때고, 3의 이진수인 0000 0011의 모든 비트를 반전 시킨다
-> 1111 1100
여기에 1을 더하면 2의 보수이다.
-> 1111 1101
+3 => 0000 0011 과
-3 => 1111 1101 을 더해보면
1 0000 0000 이 되므로
최상위 비트에서 올라오는 수(1)을 무시하면
0000 0000으로 0이 된다.
보수
이진수에서 1의 보수라고 하면 각 비트를 1로 만들기 위해서 더해야 하는 값을 의미한다.
0000 0011의 1의 보수 -> 1111 1111을 만들기 위한 값 => 1111 1100
2의 보수는 1의 보수에 1을 더한 값이다. (1111 1101)
부동소수점형
컴퓨터 내부적으로 실수가 표현되는 방식
고정소수점
먼저 고정소수점을 알아보자.
고정소수점을 사용해 32비트 실수를 표현하게 된다면,
16비트는 소수점 위 (최대 2^15-1 - 부호로 인해 15승), 또 다른 16비트는 소수점 아래(최대 2^16-1)를 표현하게 된다.
이렇게 되면 간단하기는 하지만 표현 가능한 최대 수는 32767.65535이다.
같은 비트수를 사용해 더 넓은 범위의 실수를 표현하기 위해 나온 것이 부동소수점 방식이다.
부동소수점
소수점의 위치가 둥둥 떠서 움직인다는 뜻
가수부분과 지수부분으로 나누어서 표현한다.
149598000
가수 부분 | 지수 부분 |
1.49598 | 10 ^ 8 |
가수부분은 실수의 정밀도,
지수부분은 실수값의 범위를 결정한다.
가수와 지수부분엔 정해진 수의 비트가 할당된다.
32비트 부동 소수점에서는 1비트 부호, 8비트 지수, 23비트 가수로 구성 되고
64비트 부동 소수점에서는 1비트 부호, 11비트 지수, 52비트 가수로 구성된다.
예로 32비트 실수를 표현하게 된다면
가수부분은 6자리의 십진수로 표현이 가능하고, 지수는 10 ^ -38 부터 10 ^ 38 까지 표현이 가능하다.
float의 경우, 여기에 속한다.
지수가 8비트일 때 10 ^ 38 까지인 이유
32비트의 실수의 지수부분은 8비트로 표현되고
2의 8승 = 128
따라서 -128 부터 127까지의 값을 나타낼 수 있다.
지수 부분이 0인 경우: 2^0 = 1
지수 부분이 1인 경우: 2^1 = 2
지수 부분이 2인 경우: 2^2 = 4
...
지수 부분이 127인 경우: 2^127
지수 부분이 -1인 경우: 2^(-1) = 1/2
지수 부분이 -2인 경우: 2^(-2) = 1/4
...
지수 부분이 -128인 경우: 2^(-128)
2의 127승 = 1.7014118e+38
-> 대략 10 ^ 38
따라서 지수부분으로 표현할 수 있는 값은 -10^38 ~ 10^38이 된다.
만약 지수부분이 11비트라면 표현할 수 있는 값은
부호비트를 빼면 10비트,
2^(2^10) = 1.7976.. * 10^308 이므로
-10^308 ~ 10^308 값을 표현할 수 있다.
이 내용이 정리되어 있는 블로그
http://dailusia.blog.fc2.com/blog-entry-147.html
[IEEE 754] 왜 number 데이터타입의 범위는 38일까? - Problem/Question
Admin: DAILUSIA 모두의 소원을 이루어 주는 마녀, 그 마녀의 소원을 이루어 주고싶은 소년 K 가 되고 싶습니다. ブログのURLをコピー
dailusia.blog.fc2.com
정밀도는 10진수 값을 자료형에 저장 후 다시 10진수로 변환했을 때
다시 원래 값이 나오는 수가 보장되는 범위이다. (유효숫자)
IEEE 754 표준에서
float형은 정밀도가 7이므로 실수 0.12345678에서 처음의 7개 자리수(0.1234567)만 정확하게 나타낼 수 있다.
double은 정밀도가 15이다.
1. float와 int의 표현 가능한 수의 범위가 다른 이유는 무엇인가요?
int는 정수형으로, 고정된 범위의 정수 값만 표현이 가능하지만
float형은 실수형으로, 부동소수점을 사용하며
지수부분과 가수부분을 나눠
정수와 소수을 함께 표현하므로
int보다 더 넓은 범위의 수를 표현할 수 있습니다.
'취준 > 기술면접' 카테고리의 다른 글
배열, List, ArrayList, Dictionary (0) | 2024.01.29 |
---|---|
가비지 컬렉터, 가비지 컬렉션 (0) | 2024.01.19 |
struct와 class (0) | 2024.01.17 |
접근제한자 (0) | 2024.01.17 |
ref와 out (C#) (1) | 2024.01.17 |