컴퓨터 숫자 형식

컴퓨터 숫자 형식(Computer number format)은 프로그래밍 가능한 컴퓨터 및 계산기와 같은 디지털 장치 하드웨어 및 소프트웨어에서 숫자 값의 내부 표현이다. 숫자 값은 바이트 및 워드와 같은 비트 그룹으로 저장된다. 숫자 값과 비트 패턴 간의 인코딩은 컴퓨터 작동의 편의성을 위해 선택된다. 컴퓨터의 명령어 집합에서 사용되는 인코딩은 일반적으로 인쇄 및 표시와 같은 외부 사용을 위해 변환이 필요하다. 프로세서 유형에 따라 숫자 값의 내부 표현이 다를 수 있으며, 정수 및 실수에 대해 다른 규칙이 사용된다. 대부분의 계산은 프로세서 레지스터에 맞는 숫자 형식으로 수행되지만, 일부 소프트웨어 시스템은 여러 워드의 메모리를 사용하여 임의로 큰 숫자를 표현할 수 있도록 한다.

 이진수 표현 

컴퓨터는 데이터를 이진수 형태로 표현한다. 이 표현은 비트로 구성되며, 이 비트는 다시 바이트와 같은 더 큰 집합으로 그룹화된다.

+ 표 1: 이진수를 팔진수로 이진 문자열  팔진수 값 000  0 001  1 010  2 011  3 100  4 101  5 110  6 111  7

+ 표 2: 비트 문자열에 대한 값의 수 비트 문자열 길이 (b)  가능한 값의 수 (N) 1  2 2  4 3  8 4  16 5  32 6  64 7  128 8  256 9  512 10  1024 ...    

비트는 두 가지 상태 중 하나를 나타내는 이진 숫자이다. 비트의 개념은 1 또는 0, 켜짐 또는 꺼짐, 예 또는 아니오, 참 또는 거짓의 값으로 이해할 수 있으며, 어떤 종류의 스위치나 토글에 의해 부호화된다.

단일 비트 자체는 두 가지 값만 나타낼 수 있지만, 비트 문자열은 더 큰 값을 나타내는 데 사용될 수 있다. 예를 들어, 세 비트의 문자열은 표 1에 설명된 대로 최대 여덟 개의 고유한 값을 나타낼 수 있다.

문자열을 구성하는 비트의 수가 증가함에 따라 가능한 0과 1 조합의 수는 기하급수적으로 증가한다. 단일 비트는 두 가지 값 조합만 허용하며, 두 비트는 네 가지 별도의 값을 만들 수 있고, 세 비트는 여덟 가지 값을 만들 수 있으며, 이는 2n 공식에 따라 증가한다. 표 2에 설명된 대로 각 이진 숫자가 추가될 때마다 가능한 조합의 양은 두 배가 된다.

특정 수의 비트로 구성된 그룹은 다양한 것을 나타내는 데 사용되며 특정 이름을 갖는다.

바이트는 문자를 나타내는 데 필요한 비트 수를 포함하는 비트 문자열이다. 대부분의 최신 컴퓨터에서 이는 8비트 문자열이다. 바이트의 정의가 문자를 구성하는 비트 수와 관련되어 있기 때문에 일부 구형 컴퓨터에서는 바이트에 다른 비트 길이를 사용했다. 많은 컴퓨터 아키텍처에서 바이트는 가장 작은 주소 지정 가능한 단위이자 주소 지정 가능성의 원자라고 할 수 있다. 예를 들어, 64비트 프로세서는 한 번에 64비트 메모리에 액세스할 수 있지만, 여전히 그 메모리를 8비트 조각으로 나눌 수 있다. 이를 바이트 주소 지정 가능한 메모리라고 한다. 역사적으로 많은 CPU는 8비트의 배수로 데이터를 읽었다. 8비트 바이트 크기가 매우 일반적이지만 정의가 표준화되지 않았기 때문에 8비트 시퀀스를 명시적으로 설명하기 위해 때때로 옥텟이라는 용어가 사용된다.

니블 (때로는 nybble)은 네 비트로 구성된 숫자이다. 하프 바이트이기 때문에 니블은 말장난으로 이름이 붙여졌다. 사람은 한 입 먹기 위해 여러 니블이 필요할 수 있는 것처럼, 니블은 바이트의 일부이다. 네 비트가 16개의 값을 허용하기 때문에 니블은 때때로 16진수로 알려져 있다.

 팔진법 및 16진법 숫자 표시 

팔진법 및 16진법 인코딩은 컴퓨터에서 사용되는 이진수를 표현하는 편리한 방법이다. 컴퓨터 엔지니어는 종종 이진수 양을 작성해야 하지만, 실제로 1001001101010001과 같은 이진수를 작성하는 것은 지루하고 오류가 발생하기 쉽다. 따라서 이진수 양은 8진법 또는 "팔진법", 또는 훨씬 더 일반적으로 16진법인 "16진법"(hex) 숫자 형식으로 작성된다. 십진법에는 0부터 9까지 10개의 숫자가 있으며, 이들을 조합하여 숫자를 형성한다. 팔진법에는 0부터 7까지 8개의 숫자만 있다. 즉, 팔진법 "10"의 값은 십진법 "8"과 같고, 팔진법 "20"은 십진법 "16" 등과 같다. 16진법에는 0부터 9까지의 숫자 뒤에 관례적으로 A부터 F까지의 16개 숫자가 있다. 즉, 16진법 "10"은 십진법 "16"과 같고 16진법 "20"은 십진법 "32"와 같다. 다른 기수법의 숫자에 대한 예시 및 비교는 아래 차트에 설명되어 있다.

숫자를 입력할 때, 숫자 체계를 설명하기 위해 서식 문자를 사용한다. 예를 들어 이진수에는 000_0000B 또는 0b000_00000을 사용하고, 16진수에는 0F8H 또는 0xf8을 사용한다.

 기수 간 변환 

+ 표 3: 다른 기수에서 값 비교 십진수  이진수  팔진수  16진수 0  000000  00  00 1  000001  01  01 2  000010  02  02 3  000011  03  03 4  000100  04  04 5  000101  05  05 6  000110  06  06 7  000111  07  07 8  001000  10  08 9  001001  11  09 10  001010  12  0A 11  001011  13  0B 12  001100  14  0C 13  001101  15  0D 14  001110  16  0E 15  001111  17  0F

이러한 각 숫자 체계는 위치 체계이지만, 십진법의 가중치가 10의 거듭제곱인 반면, 팔진법의 가중치는 8의 거듭제곱이고 16진법의 가중치는 16의 거듭제곱이다. 16진수나 팔진수를 십진수로 변환하려면, 각 자리에 대해 숫자의 값을 해당 위치의 값으로 곱한 다음 그 결과를 더한다. 예를 들어:



 이진수로 분수 표현 

 고정소수점 숫자 

고정소수점 형식은 이진수로 분수를 표현하는 데 유용할 수 있다.

원하는 정밀도와 범위에 필요한 비트 수는 숫자의 소수 부분과 정수 부분을 저장하기 위해 선택해야 한다. 예를 들어, 32비트 형식을 사용하는 경우, 정수 부분에 16비트, 소수 부분에 16비트를 사용할 수 있다.

8의 자릿수 다음에는 4의 자릿수, 그 다음에는 2의 자릿수, 그 다음에는 1의 자릿수가 온다. 소수 비트는 정수 비트가 설정한 패턴을 계속한다. 다음 비트는 1/2의 비트, 그 다음에는 1/4의 비트, 그 다음에는 1/8의 비트 등이다. 예를 들어:
            정수 비트    소수 비트 0.500 =  = 00000000 00000000.10000000 00000000 1.250 == 00000000 00000001.01000000 00000000 7.375 == 00000000 00000111.01100000 00000000
이러한 인코딩 형식은 일부 값을 이진수로 나타낼 수 없다. 예를 들어, 십진수로 0.2인 분수 는 가장 가까운 근사치가 다음과 같다:
  13107 / 65536 = 00000000 00000000.00110011 00110011 = 십진수로 0.1999969...  13108 / 65536 = 00000000 00000000.00110011 00110100 = 십진수로 0.2000122...

더 많은 자릿수를 사용하더라도 정확한 표현은 불가능하다. 십진수로 0.333333333...으로 쓰이는 숫자 은 무한히 계속된다. 일찍 종료되면 값은 을 정확하게 나타내지 않는다.

 부동소수점 숫자 
디지털 시스템에서 부호 없는 정수와 부호 있는 정수 모두 사용되지만, 32비트 정수조차도 계산기가 처리할 수 있는 모든 범위의 숫자를 처리하기에 충분하지 않으며, 이는 분수를 포함하지도 않는다. 실수의 더 넓은 범위와 정밀도를 근사화하기 위해 우리는 부호 있는 정수와 고정 소수점 숫자를 버리고 "부동소수점" 형식으로 가야 한다.

십진법에서 우리는 다음과 같은 형태의 부동소수점 숫자에 익숙하다 (과학적 기수법):

 1.1030402 × 105 = 1.1030402 × 100000 = 110304.02

또는 더 간결하게:

 1.1030402E5

이는 "1.1030402 곱하기 1 뒤에 0이 5개"를 의미한다. 우리는 "유효 숫자"로 알려진 특정 숫자 값(1.1030402)을 가지며, 이는 "지수"로 알려진 10의 거듭제곱(E5, 즉 105 또는 100,000을 의미)으로 곱해진다. 음수 지수가 있으면 그 숫자는 소수점 오른쪽으로 그만큼의 자릿수만큼 1을 곱한다. 예를 들어:

 2.3434E−6 = 2.3434 × 10−6 = 2.3434 × 0.000001 = 0.0000023434

이 방식의 장점은 지수를 사용하여 훨씬 더 넓은 범위의 숫자를 얻을 수 있다는 것이다. 비록 유효 숫자의 자릿수, 즉 "숫자 정밀도"가 범위보다 훨씬 작더라도 말이다. 유사한 이진 부동소수점 형식은 컴퓨터에 대해 정의될 수 있다. 이러한 방식은 여러 가지가 있으며, 가장 널리 사용되는 것은 IEEE에 의해 정의되었다. IEEE 754-2008 표준 사양은 다음과 같은 64비트 부동소수점 형식을 정의한다.

 11비트 이진 지수, "excess-1023" 형식 사용. excess-1023은 지수가 0부터 2047까지의 부호 없는 이진 정수로 나타남을 의미하며, 1023을 빼면 실제 부호 있는 값이 된다.
 52비트 유효 숫자, 역시 부호 없는 이진수이며, 선행하는 암시적 "1"로 소수 값을 정의한다.
 부호 비트, 숫자의 부호를 나타낸다.

8바이트 메모리에 저장된 비트:

 바이트 0 S  x10  x9  x8  x7  x6  x5  x4 바이트 1 x3  x2  x1  x0  m51  m50  m49  m48 바이트 2 m47  m46  m45  m44  m43  m42  m41  m40 바이트 3 m39  m38  m37  m36  m35  m34  m33  m32 바이트 4 m31  m30  m29  m28  m27  m26  m25  m24 바이트 5 m23  m22  m21  m20  m19  m18  m17  m16 바이트 6 m15  m14  m13  m12  m11  m10  m9  m8 바이트 7 m7  m6  m5  m4  m3  m2  m1  m0

"S"는 부호 비트, "x"는 지수 비트, "m"은 유효 숫자 비트를 나타낸다. 여기서 추출된 비트는 다음 계산으로 변환된다.

   <부호> × (1 + <소수 유효 숫자>) × 2<지수> − 1023

이 방식은 약 15십진 자릿수까지 유효한 숫자를 제공하며, 숫자의 범위는 다음과 같다.
 최대값 최소값 양수 1.797693134862231E+308 4.940656458412465E-324 음수 -4.940656458412465E-324 -1.797693134862231E+308

이 사양은 또한 정의되지 않은 여러 특수 값을 정의하며, "숫자가 아님"을 의미하는 NaN으로 알려져 있다. 이는 프로그램에서 유효하지 않은 연산 등을 지정하는 데 사용된다.

일부 프로그램은 32비트 부동소수점 숫자도 사용한다. 가장 일반적인 방식은 부호 비트와 23비트 유효 숫자를 사용하며, "excess-127" 형식의 8비트 지수를 사용하여 7개의 유효한 십진 자릿수를 제공한다.

 바이트 0  S    x7   x6   x5   x4   x3   x2   x1 바이트 1  x0  m22  m21  m20  m19  m18  m17  m16 바이트 2 m15  m14  m13  m12  m11  m10   m9   m8 바이트 3  m7   m6   m5   m4   m3   m2   m1   m0
비트는 다음 계산으로 숫자 값으로 변환된다.

 <부호> × (1 + <소수 유효 숫자>) × 2<지수>  − 127

다음과 같은 범위의 숫자가 생성된다.
 최대값 최소값 양수 3.402823E+38 2.802597E-45 음수 -2.802597E-45 -3.402823E+38

이러한 부동소수점 숫자는 일반적으로 "실수" 또는 "부동소수점"으로 알려져 있지만, 여러 가지 변형이 있다.

32비트 부동소수점 값은 때때로 "real32" 또는 "single"이라고 불리며, "단정밀도 부동소수점 값"을 의미한다.

64비트 부동소수점은 때때로 "real64" 또는 "double"이라고 불리며, "배정밀도 부동소수점 값"을 의미한다.

숫자와 비트 패턴 사이의 관계는 컴퓨터 조작의 편의를 위해 선택된다. 컴퓨터 메모리에 저장된 8바이트는 64비트 실수, 두 개의 32비트 실수, 또는 네 개의 부호 있는 또는 부호 없는 정수, 또는 8바이트에 맞는 다른 종류의 데이터를 나타낼 수 있다. 유일한 차이점은 컴퓨터가 이를 해석하는 방식이다. 컴퓨터가 네 개의 부호 없는 정수를 저장한 다음 이를 64비트 실수로 메모리에서 다시 읽어들인다면, 거의 항상 완벽하게 유효한 실수이겠지만, 이는 쓰레기 데이터일 것이다.

주어진 비트 수로는 유한한 범위의 실수만 표현할 수 있다. 산술 연산은 오버플로 또는 언더플로가 발생하여 표현할 수 없을 정도로 너무 크거나 너무 작은 값을 생성할 수 있다.

표현은 제한된 정밀도를 갖는다. 예를 들어, 64비트 실수로는 15자리 십진수만 표현할 수 있다. 아주 작은 부동소수점 숫자가 큰 숫자에 더해지면 결과는 그냥 큰 숫자가 된다. 작은 숫자는 15자리 또는 16자리의 해상도에 나타나기에는 너무 작아서 컴퓨터는 효과적으로 이를 버린다. 제한된 정밀도의 영향을 분석하는 것은 잘 연구된 문제이다. 반올림 오류의 크기 추정 및 대규모 계산에서 그 영향을 제한하는 방법은 모든 대규모 계산 프로젝트의 일부이다. 정밀도 제한은 범위 제한과 다르다. 이는 지수에는 영향을 미치지 않고 유효 숫자에 영향을 미치기 때문이다.

유효 숫자는 십진 분수와 반드시 완벽하게 일치하지 않는 이진 분수이다. 많은 경우에 2의 역수 거듭제곱의 합은 특정 십진 분수와 일치하지 않으며, 계산 결과는 약간 오차가 있을 수 있다. 예를 들어, 십진 분수 "0.1"은 무한히 반복되는 이진 분수 0.000110011 ...과 동등하다.

 프로그래밍 언어의 숫자 
어셈블리어로 프로그래밍하려면 프로그래머가 숫자의 표현을 추적해야 한다. 프로세서가 필요한 수학 연산을 지원하지 않는 경우, 프로그래머는 연산을 수행할 적절한 알고리즘과 명령어 시퀀스를 고안해야 한다. 일부 마이크로프로세서에서는 정수 곱셈조차도 소프트웨어로 수행해야 한다.

루비 및 파이썬과 같은 상위 프로그래밍 언어는 유리수, 큰 정수 또는 복소수와 같이 확장된 유형일 수 있는 추상 숫자를 제공한다. 수학 연산은 언어 구현에서 제공하는 라이브러리 루틴에 의해 수행된다. 소스 코드의 주어진 수학 기호는 연산자 오버로딩에 의해 숫자 유형의 표현에 적합한 다른 오브젝트 코드를 호출한다. 부호 있는, 부호 없는, 유리수, 부동소수점, 고정소수점, 정수 또는 복소수 등 어떤 숫자든 수학 연산은 정확히 동일한 방식으로 작성된다.

REXX 및 자바와 같은 일부 언어는 십진 부동소수점 연산을 제공하여 다른 형태의 반올림 오류를 발생시킨다.

 같이 보기 
 임의 정밀도 연산
 이진화 십진법
 이진 텍스트 인코딩
 이진법
 그레이 부호
 기수법

 각주 

분류:컴퓨터 산술
분류:기수법