왜 이렇게 많은 숫자 유형 (비트, int, float, double, long)이 있습니까?


9

PHP, Java 및 C를 배웠습니다. 이제 비트, int, float, double 및 long과 같은 유형의 숫자 ​​데이터 유형이 왜 많은지 궁금합니다. 숫자에 대해 한 가지 유형 만 사용하는 것이 어떻습니까?

이것에 어떤 이점이 있습니까? 어쩌면 정수를 사용하여 작은 숫자를 보유하면 메모리를 절약 할 수 있습니까?


6
HorusKol의 답변 외에도 'float'및 'integer'유형은 본질적으로 다릅니다. 플로트는 매우 큰 숫자를 가질 수 있지만 숫자의 크기가 커질수록 정밀도는 떨어집니다. 이 부정확성은 수레가 저장되는 방식 때문입니다. 반대로 정수에 저장할 수있는 값의 범위는 매우 제한적이지만 값은 항상 정확하므로 값을 훨씬 쉽게 비교할 수 있습니다. 또한 나누기에는 두 가지 유형의 동작이 있습니다. 정수는 가장 가까운 정수로 자동 '잘라 내기'하지만 부동은 그렇지 않습니다. 이러한 각 동작은 다양한 상황에 유용합니다.
kampu

Javascript는 표면에 하나의 숫자 유형 만 있습니다.
Esailija

@kampu : 사실, 많은 언어에서 정수는 (가상) 메모리가 그것을 표현하기에 충분히 큰 한 숫자를 저장할 수 있습니다.
Jörg W Mittag

1
@ JörgWMittag : 그러나 문제는 분명히 파이썬과 같은 동적 언어가 아닌 정적 언어에 관한 것입니다. CPython 자체는 32 비트 정수의 배열로 '무제한 범위'정수를 구현하며, 각 정수의 마지막 비트는 더 많은 비트가 있는지 표시하는 데 사용됩니다. 또한, 정수는 저장할 수 있습니다 전체 숫자 만합니다. 즉, 무한 저장을 가진 float는 값을 정밀도 (infinity aleph one)에 저장할 수 있고 정수는 값을 정밀도 ( infinity aleph zero ) 에만 저장할 수 있습니다 .
kampu

@kampu : 모든 숫자는 일련의 비트로 표현되기 때문에 무한 저장에서도 부동 소수점 숫자와 정수 사이에는 일대일 매핑이 있습니다. 그래서 저는 알레프가 질문을한다고 생각하지 않습니다.
에서 오는

답변:


17

다른 숫자 데이터 유형에 관심을 가져야하는 이유는 두 가지입니다.

1. 메모리 절약

for(long k=0;k<=10;k++)
{
    //stuff
}

정수 또는 바이트가 될 수있을 때 long을 사용하는 이유는 무엇입니까? 그렇게함으로써 실제로 몇 바이트의 메모리를 절약 할 수 있습니다.

2. 부동 소수점 숫자와 정수는 컴퓨터에 다르게 저장됩니다

22에 정수가 저장되어 있다고 가정합니다. 컴퓨터는이 숫자를 메모리에 이진으로 다음과 같이 저장합니다.

0000 0000 0000 0000 0000 0000 0001 0110

이진수 시스템에 익숙하지 않다면 과학적 표기법으로 표현할 수 있습니다 : 2 ^ 0 * 0 + 2 ^ 1 * 1 + 2 ^ 2 * 1 + 2 ^ 3 * 0 + 2 ^ 4 * 1 + 2 ^ 5 * 0 + ... + 2 ^ 30 * 0. 마지막 비트는 숫자가 음수인지를 나타내는 데 사용되거나 사용되지 않을 수 있습니다 (데이터 유형이 서명 또는 서명되지 않은 경우에 따라 다름).

기본적으로 2 ^ (비트 플레이스) * 값의 요약입니다.

소수점이 포함 된 값을 참조 할 때 변경됩니다. 10 진수로 3.75의 숫자가 있다고 가정하십시오. 이를 이진에서는 11.11이라고합니다. 우리는 이것을 2 ^ 1 * 1 + 2 ^ 0 * 1 + 2 ^ -1 * 1 + 2 ^ -2 * 1 또는 1.111 * 2 ^ 2로 정규화 된 표기법으로 나타낼 수 있습니다

그러나 컴퓨터는 저장할 수 없습니다. 이진수 (이진수 시스템 버전의 소수점)를 명시 적으로 표현하는 방법은 없습니다. 컴퓨터는 1과 0 만 저장할 수 있습니다. 부동 소수점 데이터 유형이 들어옵니다.

sizeof (float)가 4 바이트라고 가정하면 총 32 비트가됩니다. 첫 번째 비트에는 "부호 비트"가 할당됩니다. 부호없는 플로트 나 복식은 없습니다. 다음 8 비트는 "지수"에 사용되며 마지막 23 비트는 "유의"(또는 가수로 지칭 됨)로 사용됩니다. 우리의 3.75 예를 사용하면 지수는 2 ^ 1이되고 유의 값은 1.111이됩니다.

첫 번째 비트가 1이면 숫자는 음수입니다. 그렇지 않다면 긍정적입니다. 지수는 "바이어스 (bias)"라 불리는 것에 의해 수정되므로 단순히 "0000 0010"을 지수로 저장할 수 없습니다. 단 정밀도 부동 소수점 수에 대한 바이어스는 127이며, 배정도에 대한 바이어스 (이중 데이터 유형이 이름을 갖는 위치)는 1023입니다. 마지막 23 비트는 유효를 위해 예약됩니다. 의의는 단순히 이진 점의 오른쪽에있는 값입니다.

우리의 지수는 치우침 (127) + 지수 (1)이거나 이진수로 표현됩니다

1000 0000

우리의 중요성은 다음과 같습니다.

111 0000 0000 0000 0000 0000

따라서 3.75는 다음과 같이 표시됩니다.

0100 0000 0111 0000 0000 0000 0000 0000

이제 부동 소수점 숫자와 정수 숫자로 표시된 숫자 8을 살펴 보겠습니다.

0100 0001 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1000

컴퓨터가 어떻게 8.0과 8을 추가할까요? 아니면 곱하기까지!? 컴퓨터 (특히 x86 컴퓨터)에는 부동 소수점 숫자와 정수를 추가하는 CPU의 다른 부분이 있습니다.


3
3) 거의 문제는 아니지만 : 컴퓨터의 단어 크기보다 큰 숫자의 작업은 느립니다.
Loren Pechtel

6

기가 바이트 시스템 (또는 Arduino와 같은 최신 임베디드 시스템)을 사용하기 전에는 메모리가 프리미엄이었고 특정 숫자가 차지하는 메모리 양을 지정하는 간단한 방법이 구현되었습니다-BIT는 간단합니다-원래 1 비트 만 차지합니다 기억의.

다른 데이터 크기와 이름은 시스템마다 다릅니다. 32 비트 시스템에서 INT (또는 MEDIUMINT)는 일반적으로 2 바이트, LONGINT는 4 바이트, SMALLINT는 단일 바이트입니다. 64 비트 시스템은 LONGINT를 8 바이트로 설정할 수 있습니다.

특히 데이터베이스 응용 프로그램 또는 서버에서 여러 인스턴스를 실행하는 프로그램 (예 : 웹 사이트의 서버 쪽 스크립트) 에서조차도 선택에주의해야합니다. 수백만 개의 레코드가있는 데이터베이스 테이블이있는 경우 0에서 100 사이의 값 (1 바이트에 맞을 수 있음)을 저장하기 위해 2, 4 또는 8 바이트 폭의 정수를 선택하는 것은 엄청나게 낭비입니다.

자세한 정보 : https://en.wikipedia.org/wiki/Integer_(computer_science)


좋은 대답 +1.
Vinay

7
'이전'뿐만 아니라 '지금 시스템이 작을 때'도 있습니다. Arduino 크기의 장치는 경제적이어야합니다.
9000

1
비트를 저장하기 위해 1 비트 만 사용한 시스템은 무엇입니까? 비트는 일반적으로 직접 주소를 지정할 수 없습니다
jk.

1
그것은 많은 아키텍처에서 사실이지만 비트는 실제로 오래된 시스템과 심지어 가장 최근의 임베디드 시스템에서 직접 주소 지정할 수 있습니다. 요즘 컴파일러는 그것을 해결하고 바이트 배열에 넣습니다.
HorusKol

가장 중요한 요소는 메모리 문제보다는 CPU 능력과 성능이라고 생각합니다.
James

4

cpmjr123의 메모리 부족 및 정밀도 및 범위 트레이드 오프에 대한 뛰어난 점 외에도 CPU 트레이드 오프 일 가능성이 있습니다.

대부분의 최신 머신에는 FPU라는 부동 소수점 연산을 수행하기위한 특수 하드웨어가 있습니다. 또한 FPU가없는 시스템 (현재는 일반적으로 소형 내장형 장치 임)이 있으므로 대상 하드웨어에 따라 부동 소수점 유형을 전혀 사용하지 않거나 소프트웨어 부동 소수점 라이브러리를 사용해야합니다. 컴퓨터에 FPU가 있더라도 제공 할 수있는 기능에 차이가있었습니다. 하드웨어에서 수행되지 않은 기능은 소프트웨어에서 수행하거나 피해야합니다

소프트웨어에서 부동 소수점 계산은 하드웨어가 지원하는 많은 간단한 작업을 수행하여 수행됩니다. 그러므로 당신은 잠재적 인 속도 트레이드 오프도 얻습니다.


4

아마도 가장 중요한 것은 실제로 세 가지 기본 숫자 유형이 있다는 것입니다.

정수, 고정 소수점 및 부동 소수점.

그들은 모두 다르게 행동합니다.

7/2와 같은 간단한 조작은 사용 된 데이터 유형에 따라 3, 3.50 및 3.499의 답변을 제공 할 수 있습니다.

"고정 10 진수"는 신데렐라 유형이며 COBOL 및 VisualBasic과 같은 일부 언어에서만 기본적으로 지원됩니다. 컴퓨터 과학자에게는 거의 관심이 없지만 인보이스에서 계정 집합을 제출하거나 판매 세를 계산하는 사람에게는 필수적입니다.


나는 별개의 숫자, 대략적인 숫자 및 대수 고리를 감싸는 방식으로 다르게 분리했습니다. C의 전형적인 예는 것 int, float그리고 unsigned int각각. 고정 소수점 유형은 이산 유형의 하위 범주이지만 대수 고리는 숫자와 근본적으로 다릅니다. [C에서 부호없는 유형에 대한 혼동은 대부분 숫자가 아닌 고리처럼 행동하지만 일관성이 없다는 사실에서 비롯 됩니다) .
supercat

3

그들이 얻는 이점이 있습니까?

물론이야. 이점이 있습니다. 컴퓨터 세계에서 메모리는 고려해야 할 가장 중요한 것 중 하나입니다. 데이터가 1kb 미만일 수있는 경우 2kb의 메모리를 사용하는 것은 무엇입니까? . 최적화가 있어야합니다. 더 많은 메모리를 사용하면 분명히 컴퓨터 속도를 떨어 뜨립니다. 당신은 정말로 그것을 좋아합니까? 권리 없다...?

int - 2 bytes (16 bits)

long - 4 bytes (32 bits)

long long - 8 bytes (64 bits)

float - 4 bytes

메모리뿐만 아니라 숫자 유형의 구성도 있습니다. 인스턴스 부동 소수점. 정밀도는 매우 중요하며 분명히 우리에게 더 많은 정밀도를 줄 수있는 한 가지 유형이 있어야합니다.

우리가 옛날을 고려한다면, 우리는 당신이 알고 있듯이 메모리가 매우 적습니다. 그것을 저장하고 현명하게 사용하기 위해 우리는 이러한 차이점이있었습니다. 더 나아가서 Google 검색을 시도해 보면 훨씬 더 도움이됩니다. 도움이 되길 바랍니다.


3

정수와 실수 (float, double) 숫자는 개념적으로 다른 유형의 연산과 고유 속성을 갖습니다.

정수는 열거 가능하지만 실수는 그렇지 않습니다.

실제로 Float / double 숫자는 가수와 지수의 두 정수 필드를 결합한 구조입니다. 복소수 (고려에서 제외)는 훨씬 더 복잡합니다.

실제 언어는 적어도 정수와 부동 소수점을 고유 한 유형으로 나타내야합니다.


나는 당신이 언급 한 "복잡한 숫자"에 익숙하지 않습니다. 더 설명해 주시겠습니까?
cpmjr123

이를 확인하십시오 : en.wikipedia.org/wiki/Complex_number
c-smile

a + bi 형식의 복소수를 알고 있습니다. 컴퓨터가 복소수를 저장하는 방법에 대한 자세한 정보를 요청했습니다. 내 지식으로는 이것을 지원하는 기본 데이터 유형이 없습니다.
cpmjr123

복소수는 일반적으로 두 개의 부동 소수점 값, 즉 a(실제 부분)과 b(가상 부분) 으로 저장됩니다 . CPU는 일반적으로 복소수 연산에 대한 기본 지원을 구현하지 않지만 (a b + c d) 및 (a b-c d) 와 같은 값 쌍에 대한 연산에 대해서는 가속 곱하기 추가 명령어를 구현할 수 있습니다 .
rwong

1
또한 많은 언어에는 래핑 대수 링의 동작으로 크게 정의 된 일부 유형이 있습니다 (예 : 유형의 변수 uint16_t가 65535를 보유하고 증가하면 0을 보유합니다). 이상적으로 언어는 대수 고리와 숫자를 감싸는 것을 표현하기 위해 깨끗하게 분리 된 유형을 갖습니다 ( 넘치는 숫자 는 갇히게하고 코드는 바꿈 할 것으로 예상되는 작업을 쉽게 수행 할 수 있음 ).
supercat

-1

또한 부동 소수점 유형이 정수 유형과 완전히 다르게 작동한다는 사실 외에도 숫자 당 크기가 실제로 중요한 이유에 대해 더 극단적 인 예를 드리고 싶습니다.

(긴) 배열을 정렬한다고 가정하십시오. 예를 들어 C에서 :

int numbers[100000000];

여기에는 1 억 개의 숫자가 있습니다.

각 숫자의 길이가 1 바이트에 불과한 경우 ( unsigned char대신에 사용 int) 1 억 바이트의 공간이 필요합니다.

을 사용하는 경우 double이는 일반적으로 숫자 당 8 바이트이므로 800 백만 바이트의 공간입니다.

따라서 많은 개체 (이 예제에서는 숫자)로 작업 할 때마다 개체 당 크기 (이 예제에서는 숫자 당 크기)가 중요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.