티스토리 뷰

카테고리 없음

1/5 회고

clearlyhunch 2021. 1. 5. 22:53

정보의 표현과 처리

 

정수

16진수 표현

0, 1로 표시되는 이진수로 비트패턴을 표현하기 어렵기에 0~F까지의 16진수를 사용한다.

어떤 값 x를 n진수로 표현하고자 한다면 x는 몫 q와 나머지 r을 이용하여 표시할 수 있다.

x = q*n + r과 같은 형태로 반복해서 q가 0이 될 때까지 나타내면 된다.

워드 크기

워드 크기 포인터의 정규크기를 나타내기 위해서 사용하는데 2^w - 1까지의 가상주소를 가지면 w가 32비트인지 64비트인지에 따라서 표시가 바뀔 수 있다.

64비트에서 32비트에 호환되는 컴파일을 하고자 한다면 gcc에서 -m32 옵션을 주면 된다.

반대도 마찬가지이다. -m64를 주면 64비트에서의 컴파일을 할 수 있다.

데이터 포멧

C언어에서는 정수와 부동소수점 데이터를 여러 가지 데이터 포멧의 지원으로 표시할 수 있다.

정수형의 경우 정수에서 음수, 양수를 표시하기 위해서 부호비트를 사용한다.

가장 우측에 존재하는 비트인 LSB(Least Significant Bit)와 가장 좌측에 존재하는 비트인 MSB(Most Significant Bit) 중에서 MSB를 활용해서 부호비트를 표시한다.

이때 0은 양수쪽에서 표현하기 때문에 -2^(n-1) ~ 2^(n-1) -1 까지 표현할 수 있다.

만약 양수만 표현하고자 한다면 0 ~ 2^n -1까지 표현할 수 있다.

 

이 과정은 정규화의 과정에서 값을 이동하는 것을 고려하면 쉽게 이해할 수 있을 것이다.

0부터 1까지의 범위를 갖도록 2^n-1 값으로 나누기만 하면 정규화로 표현할 수 있다.

부호형

signed와 unsigned로 구분할 수 있지만 명시가 돼있지 않다면 이것은 부호형으로 판단한다.

MSB와 LSB중에서 어떤 바이트를 먼저 저장하느냐에 따라서 엔디안을 정할 수 있다.

Big endian의 경우는 낮은 주소에 MSB가 오게되고, Little endian의 경우에는 낮은 주소에 LSB가 오게 된다. 이때 1바이트가 저장될 수 있기 때문에 16진수 2개씩 저장되는 것을 주의해야 한다.

 

대부분의 인텔 컴퓨터는 리틀 엔디안 방식으로 동작한다.

Boolean 대수

이진수 값 1과 0을 이용하여 논리값 TRUE와 FALSE로 인코딩하여 대수학을 수식화 할 수 있다.

 

C에서는 비트수준 연산을 위해서 | (OR) / & (AND) / ~ (NOT) / ^ (EXCLUSIVE-OR) 로 연산을 할 수 있다.

 

쉬프트 연산

산술 쉬프트와 논리 쉬프트가 있는데 논리는 정확하게 값만 옮기는 것이고 산술은 부호를 유지하기 위해서 MSB값을 복사해서 채워넣는 방식이다.

이런 쉬프트 연산을 사용하면 n진수에 대해서 n을 곱하거나 n을 나눈 효과를 얻을 수 있다.

2의 보수(two's complement) 인코딩

이것을 쉽게 생각한다면 MSB 즉, 부호비트가 0일 때는 기존 이진수와 동일하게 계산하면 된다.

하지만 부호비트가 1일 때는 해당 음수의 최솟값에서 해당 이진수의 값을 빼면 된다.

 

예를 들어 1100 이라는 값이 있다면 100을 최소값인 -8에서 더해준다.

따라서 값은 -8 + 4 = -4 가 된다.

 

음수를 양수로 변경하거나 양수를 음수로 변경하고자 하면 전체 부호를 1은 0로 0은 1로 바꾼 뒤 1을 더해주면 된다.

 

예를 들어 1100 이라는 값은 0011 + 1 = 0100 = 4라는 값이 된다.

수의 비트 표시 확장

부호형과 비부호형에 대해서 다르게 동작한다.

하지만 둘 다 큰 고민을 할 필요는 없다.

비부호형은 늘리고자 하는 비트만큼 좌측에 0을 추가한다.

부호형은 늘리고자 하는 비트만큼 좌측에 1을 추가한다.

 

예를 들어 비부호형에서 1001 = 9이다.

이를 8비트로 늘린다고 하면 000 1001 = 9 로 동일하다.

마찬가지로 부호형이더라도 크게 다르지 않다.

1001 = -7이라는 값인데 이를 유지하면서 8비트로 늘린다고 해보자

1111 1001 이라는 값으로 하면 -128 + 121 = -7 이 동일하게 도출된다.

숫자의 절삭

수를 비트가 작은 표현형으로 표현하면 동일한 비트 값이더라도 다른 결과로 도출될 수 있다.

 

예를 들어 int 형 53191을 short로 표현하면 -12345가 된다.

오버플로우

오버플로우는 앞서 보았던 부호형끼리 연산을 하였을 때, 표현하고자 하는 값의 범위를 넘어서서 부호비트가 변하는 현상에서 기인한다.

양수와 양수의 덧셈이나 곱셈을 수행하였는데 결과가 음수가 나온다거나 하는 경우를 의미한다.

덧셈에 대해서는 n비트와 n비트를 연산하면 n+1비트 자리까지 가능하다.

곱셈의 경우는 2*n 비트자리까지 가능하다는 것을 주의해야 한다.

정수에 대해서는 이제 오버플로우와 관련된 부분을 언급하고 부동소수점으로 넘어가기로 한다.

 

부동소수점

IEEE 754

위치에 기반한 표기방법은 큰 수를 표시할 때, 효율적이지 못했다.

지금부터 알아볼 IEEE 부동소수점은 이를 효율적으로 나타낼 수 있다.

IEEE표준은 수를 (-1)^s * M * 2^E의 형태로 나타낸다.

부호 s는 숫자가 음수인지 아닌지 즉, 부호를 나타낸다.

유효숫자 M(frac)은 비율 이진수로 1과 2 - ε 사이 또는 0과 1 - ε사이의값을갖는다.

지수 E(exp)는 2의 제곱으로 자리값을 제공한다.

이를 이용해서 값을 표시하는 것은 정규화 값, 비정규화 값, 특수 값 3가지로 나눌 수 있다.

 

아래 그림은 single-precision의 경우이며, 8비트로 exp를, 23비트로 frac을 나타낸다.

만약 64비트라면 exp = 11, frac은 52비트를 가진다.

그림출처namu.wiki/w/%EC%BB%B4%ED%93%A8%ED%84%B0%EC%97%90%EC%84%9C%EC%9D%98%20%EC%88%98%20%ED%91%9C%ED%98%84

1. 정규화 값

가장 일반적인 경우로서 exp의 비트 패턴이 모두 0이 이거나 모두 1이 아닌 경우다.

이때 지수값 E = e - Bias의 값을 가진다.

Bias값은 127(32bit)과 1024(64bit)를 사용한다.

이렇게 하면 지수의 범위는 -126~127(32bit), -1022~1023(64bit)의 범위를 가진다.

유효숫자 M = 1 + frac으로 정의되며, 이렇게 하면 추가비트 한개를 무료로 얻을 수 있다.

2. 비정규화 값

지수 필드가 모두 0일 때이다.

지수 값은 E = 1 - Bias이고, 유효숫자 M = f로 판단한다.

3. 특수 값

지수 필드가 모두 1인 경우이다. s에 따라서 0이면 양의 무한대, 1이면 음의 무한대를 의미한다.

 

회고

오랜만에 다시 정리하며 복습하려니 생각보다 시간이 적어서 다음부터는 정리를 조금 덜 하려고 한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함