cyphen156

수치자료 : 2의 보수 표현법 본문

컴퓨터공학/자료구조

수치자료 : 2의 보수 표현법

cyphen156 2023. 8. 7. 13:32

오늘날의 현대 컴퓨팅 환경에서는 대부분 2의 보수를 통해 수치 자료를 표현한다.

2의 보수

2의 보수란 2진수 체계에서 음수와 양수, 그리고 0이라는 수를 표현하기 위해 사용되는 수 체계로, 8비트를 기준으로 최상위 비트(MSB)를 부호비트로 사용하고, 남는 7개의 비트를 통해 수를 표현하는 방법이다. 숫자 0인 경우 00000000(0),양수의 경우 00000001(1)~01111111(127), 11111111(-1)~10000000(-128)로 표현된다.

특이한 점은 양수의 표현 범위가 2의 7제곱이 아니라 2의 7제곱 -1이라는 사실인데 이것은 0의 존재를 표현하기 위해서이다.

2의 보수체계에서 양수를 음수로 만드는 과정은 간단하다. 2진수 양수의 모든 비트를 반전(0->1, 1->0)시킨뒤, 1을 더하면 된다. 이 1을 더하는 이유는 -0이라는 수는 없기 때문00000000을 반전시킨 11111111이 -0을 의미하는것이 아닌 -128을 의미하기 때문이다.

가령 +213이라는 수는 2의 보수 체계에서 8비트를 넘어가기 때문에 int형 자료형인 32비트를 기준으로 설명하면

양수인 경우

0/000 0000 0000 0000 0000 0000 1101 0101

음수인 경우

   1/111/ 1111 1111 1111 1111 1111 0010 1010

+ 0000 0000 0000 0000 0000 0000 0000 0001을 연산하면

최종적으로

1111 1111 1111 1111 1111 1111 0010 1011이 된다.

2진수의 실수 표현

컴퓨터의 실수 표현법은 특이하다. 소숫점의 위치가 고정되어 표현되는 고정소숫점 형식과 10 진수의 지수 e(exponential)를 사용한 부동소숫점 형식 두 가지 형식과 자료형의 정밀도(표현범위)에 따라 단정도배정도가 있다. 

고정소숫점 형식

고정 소숫점 형식은 일반적인 32비트 체계에서 16/16비트를 사용하여 각각 정수와 소수를 표현하는 방식이다.

가령 +213.456을 고정소숫점으로 표현하면

0000 0000 1101 0101(+213) / 0111 0100 0101 1011(0.456[소숫점 16이하 자릿수 생략])가 된다.

하지만 고정소숫점 표현법은 표현범위가 작기 때문에 일반적으로 잘 사용되지 않는다.

부동소숫점 형식

부동소숫점 형식은 단정도를 기준으로 최상위 1개의 부호비트(MSB)와, 8개의 지수부 비트(정수), 23개의 가수부 비트(소수)를 통해 자료를 표현한다. 이렇게 실수를 표현했을때의 장점은 고정소숫점에 비해 훨씬 넓은 범위(±1.4 x 10^(-45) ~ ±3.4 x 10^(38))를 표현할 수 있다는 점이다. 

단정도(Float)

단정도는 1개의 부호비트와 8개의 지수 비트, 23개의 가수 비트를 사용하여 총 32개의 비트를 사용한다.

지수부는 음수를 표현하지 않기 때문에 2진수로 변환된 8비트(256)의 정수에 -127(Bias/편향값)을 더하여 사용한다.

표현 범위는 최소 양수 값은 1.0 x 2^(-126)이고, 최대값은 (2 - 2^(-23)) x 2^(127)으로 대략 ±1.4 x 10^(-45) ~ ±3.4 x 10^(38)의 범위가 된다

-> 약 소숫점 이하 7자리수 까지 표현 가능

배정도(Double)

배정도는 1개의 부호비트와 11개의 지수 비트, 52개의 가수 비트를 사용하여 총 64개의 비트를 사용한다.

지수부는 음수를 표현하지 않기 때문에 2진수로 변환된 11비트의 정수(2048)에 -1023(Bias/편향값)을 더하여 사용한다.

표현 범위는 최소 양수 값은 1.0 x 2^(-1022)이고, 최대값은 (2 - 2^(-52)) x 2^(1023)로, 대략 ±4.9 x 10^(-324) ~ ±1.8 x 10^(308)의 범위가 된다

-> 약 소숫점 이하 15자리수 까지 표현 가능

보통 단정도 형식을 사용하지만 정밀한 연산이 필요한 경우에는 반드시 배정도를 사용하라고 권하고 싶다. 컴퓨터의 소숫점 연산 방식에 의해 부동소숫점의 연산은 반드시라고해도 좋을정도로 오차가 발생하기 때문이다. 아주 미세한 수치이지만 그것이 치명적인 에러를 발생시킬 수 있으니 최대한 오류 가능성을 줄이자는 것이다.

예를 들어 현실에서 수학연산인 0.1 + 1.1 == 1.2는 True이지만 

컴퓨터는 0.1 + 1.1 == 1.2라는 연산을 False이라고 판단한다. 

이것에 대한 자세한 내용은 내가 즐겨보는 유튜버의 영상을 링크로 남긴다.

코딩애플(Youtube)위 수식이 틀린 이유는? (개발자 면접 타임) - YouTube