메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

컴퓨터에서의 수 표현: 두 판 사이의 차이

noriwiki
Pinkgo (토론 | 기여)
편집 요약 없음
Pinkgo (토론 | 기여)
 
(같은 사용자의 중간 판 3개는 보이지 않습니다)
7번째 줄: 7번째 줄:
* sign bit 0: 양수 01010101<sub>2</sub> = +85<sub>10</sub>
* sign bit 0: 양수 01010101<sub>2</sub> = +85<sub>10</sub>
* sign bit 1: 음수 11010101<sub>2</sub> = -85<sub>10</sub>
* sign bit 1: 음수 11010101<sub>2</sub> = -85<sub>10</sub>
장점과 단점이 존재한다.
해당 방식은 이해하기 편하다는 점에서는 장점이 있지만, 0을 표현할 수 있는 방식이 2개라는 점, 이와 더불어 연산이 번거롭다는 점이 단점으로 꼽혀 컴퓨터에서는 잘 쓰이지 않는다.


===2의 보수법===
===2의 보수법===
56번째 줄: 56번째 줄:
signed 정수의 덧셈 또한 unsigned 정수의 덧셈과 거의 유사한 형태로 수행한다. bit sequence의 연산은 unsigned 정수와 동일한 방식으로 하되, 그 결과의 해석을 2의 보수법으로 하면 되는 것이다.
signed 정수의 덧셈 또한 unsigned 정수의 덧셈과 거의 유사한 형태로 수행한다. bit sequence의 연산은 unsigned 정수와 동일한 방식으로 하되, 그 결과의 해석을 2의 보수법으로 하면 되는 것이다.


unsigned 정수의 뺄셈은 x - y를 x +  
signed 정수의 뺄셈은 x - y를 x + ~y + 1의 형태로 해석한다. 이는 Neg<sub>w</sub>y = ~y + 1과 같기 때문이다.
 
unsigned 정수의 뺄셈은 x - y를 x + Neg<sub>w</sub>y의 형태로 해석한다. 이때 Neg<sub>w</sub>y = 2<sup>w</sup>-1이므로
UAdd<sub>w</sub>(x, Neg<sub>w</sub>y) = (x + 2<sup>w</sup> - 1) mod 2 = (x - y) mod 2와 같이 계산된다. 즉 이를 x와 y의 대소 관계에 따라 정리하면 다음과 같다.
* If x <math>\ge</math> y, then x - y
* If x < y, then x - y + 2<sup>w</sup> (negative overflow)
 
이때 unsiged와 signed 정수를 연산할 때 그 범위를 초과하는 경우를 Overeflow라고 한다. unsiged 정수의 경우는 덧셈할 때 발생할 경우에는 carry bit를 drop하여 2<sup>w</sup>을 그 결과에서 뺀 것과 같은 결과를 낸다. 또한 뺄셈할 때 발생할 경우에는 가상의 carry bit를 borrow하여 2<sup>w</sup>를 그 결과에 더한 것과 같은 결과가 나온다. 다음은 unsigned 정수의 overflow에 대한 예시이다.
* Addition: 0b1111 + 0b0010 = 0b0001
* Substraction: 0b0001 - 0b0010 = 0b1111
signed 정수의 overflow은 양수끼리 더할 때<ref>양수에서 음수를 뺐을 때</ref> 결과가 음수로 나오거나, 음수끼리 더했을 때<ref>음수에서 양수를 뺐을 때</ref> 그 결과가 양수로 변하여 발생한다. 다음은 signed 정수의 overflow에 대한 예시이다.
* Addition: 0b0110 + 0b0011 = 0b1001
* Substraction: 0b1001 - 0b0011 = 0b0110
 
==기타==
===zero extension===
[[파일:UnsignedExtension.png|테두리|프레임없음|300x300픽셀]]    [[파일:SignedExtension.png|테두리|프레임없음|300x300픽셀]]
* unsigned 정수의 경우
** Task: w-bit unsigned 정수인 x가 주어졌을 때, 이를 동일한 값을 가지는 (w+k)-bit의 수로 변호나하는 것
** 더 상위의 k bit를 단순히 0으로 채운다.
** 예시: 0b0011 -> 0b00000011
* signed 정수의 경우
** Task: w-bit signed 정수인 x가 주어졌을 때, 이를 동일한 값을 가지는 (w+k)-bit의 수로 변호나하는 것
** 더 상위의 k bit를 MSB와 동일한 bit로 채운다.
** 예시: 0b1101 -> 0b11111101
 
===Truncation===
* Task: (w+k)-bit의 signed 또한 unsigned 정수가 주어졌을 때, 이를 w bit의 정수로 간략화하는 것<ref>굳이 해당 정수의 값을 유지할 필요는 없다.</ref>
* 최상위 k bit를 삭제한다.


이때 unsiged와 signed 정수를 더할 때 그 범위를 초과하는 경우를 Overeflow


==각주==
==각주==


[[분류:컴퓨터 시스템]]
[[분류:컴퓨터 시스템]]

2025년 3월 23일 (일) 18:14 기준 최신판

개요

본문에서는 컴퓨터가 정수를 표현하는 방식에 대해서만 다룬다.

0보다 작은 정수 표현하기

sign-magnitude

첫번째 bit를 부호를 지정하는sign bit로 사용하는 방식이다.

  • sign bit 0: 양수 010101012 = +8510
  • sign bit 1: 음수 110101012 = -8510

해당 방식은 이해하기 편하다는 점에서는 장점이 있지만, 0을 표현할 수 있는 방식이 2개라는 점, 이와 더불어 연산이 번거롭다는 점이 단점으로 꼽혀 컴퓨터에서는 잘 쓰이지 않는다.

2의 보수법

2의 보수법(Two's Complement)이란 각각의 bit를 다음의 방식으로 해석하는 표현법이다.

[math]\displaystyle{ x_{w-1}\cdot(-2^{w-1})+\sum_{n=0}^{w-2}{x_i\cdot2^i} }[/math]

이때 2의 보수법을 적용하는 2진수에서의 first bit를 MSB(Most Significant Bit)라고 한다. MSB가 1이면 음수, 0이면 0이상의 정수이다.

아래는 2의 보수법을 적용하여 해석한 2진수이다.

  • 0b01010 = 0 + 8 + 2 + 0 = 10
  • 0b10110 = -16 + 0 + 4 + 2 + 0 = -10

Unsigned vs Signed

2의 보수법을 적용하여 동일한 2진 벡터를 다른 방식으로 해석할 수 있다. 아래는 그 예시이다.

  • unsigned: 0b10110 = 16 + 0 + 4 + 2 + 0 = 22
  • 2의 보수법: 0b10110 = -16 + 0 + 4 + 2 + 0 = -10

서로 다른 해석법 때문에 2진 벡터의 길이가 w일 때 unsigned 해석법과 2의 보수법은 각각 다른 범위를 가진다.

  • unsigned 범위: 0 ~ 2w-1
  • 2의 보수법 범위: -2w-1 ~ 2w-1 - 1

이때 x > 0이라면, 2의 보수법으로 해석된 음의 정수 -x를 unsigned 방식으로 해석하면 2w-x에 대응한다.

  • B2Sw(1011) = -5, B2Uw(1011) = 11

Unsigned와 Signed 사이의 변환

파일:TypeCasting.png

signed 정수와 unsigned 정수사이에서의 변환은 해당 정수의 bit 패턴을 재해석하여 이루어진다. 오른쪽 그림은 컴퓨터 내에서 explicit 타입 변환이 어떤 방식으로 이루어지는지 보여준다. [1] 또한 Unsigned 정수와 Signed 정수 사이의 변환에는 다음과 같은 관계가 성립한다.

  • S2U(x) = x + 2w [math]\displaystyle{ \times }[/math] MSB(x)
  • U2S(x) = x - 2w [math]\displaystyle{ \times }[/math] MSB(x)

또한 C에서의 형변환은 implicitly하게 발생하기도 한다. 예를 들어서 signed 정수와 unsigned 정수가 한 수식 내에서 혼용되어 사용된다면, signed 정수는 unsigned 정수로 암묵적으로 형변환된다.[2]

정수의 연산

파일:UnsignedAdd.png

unsigned 정수의 덧셈은 bit sequence를 각각의 자릿수에 맞는 bit끼리 더하고 받아올림값이 있다면 이를 적용하며 수행한다.. 이때 carry output이라고 하는 w를 초과하는 자릿수에 해당하는 받아올림값은 무시한다. 이는 결과적으로 modular sum[3]에 해당한다.

파일:SignedAdd.png

signed 정수의 덧셈 또한 unsigned 정수의 덧셈과 거의 유사한 형태로 수행한다. bit sequence의 연산은 unsigned 정수와 동일한 방식으로 하되, 그 결과의 해석을 2의 보수법으로 하면 되는 것이다.

signed 정수의 뺄셈은 x - y를 x + ~y + 1의 형태로 해석한다. 이는 Negwy = ~y + 1과 같기 때문이다.

unsigned 정수의 뺄셈은 x - y를 x + Negwy의 형태로 해석한다. 이때 Negwy = 2w-1이므로 UAddw(x, Negwy) = (x + 2w - 1) mod 2 = (x - y) mod 2와 같이 계산된다. 즉 이를 x와 y의 대소 관계에 따라 정리하면 다음과 같다.

  • If x [math]\displaystyle{ \ge }[/math] y, then x - y
  • If x < y, then x - y + 2w (negative overflow)

이때 unsiged와 signed 정수를 연산할 때 그 범위를 초과하는 경우를 Overeflow라고 한다. unsiged 정수의 경우는 덧셈할 때 발생할 경우에는 carry bit를 drop하여 2w을 그 결과에서 뺀 것과 같은 결과를 낸다. 또한 뺄셈할 때 발생할 경우에는 가상의 carry bit를 borrow하여 2w를 그 결과에 더한 것과 같은 결과가 나온다. 다음은 unsigned 정수의 overflow에 대한 예시이다.

  • Addition: 0b1111 + 0b0010 = 0b0001
  • Substraction: 0b0001 - 0b0010 = 0b1111

signed 정수의 overflow은 양수끼리 더할 때[4] 결과가 음수로 나오거나, 음수끼리 더했을 때[5] 그 결과가 양수로 변하여 발생한다. 다음은 signed 정수의 overflow에 대한 예시이다.

  • Addition: 0b0110 + 0b0011 = 0b1001
  • Substraction: 0b1001 - 0b0011 = 0b0110

기타

zero extension

파일:UnsignedExtension.png 파일:SignedExtension.png

  • unsigned 정수의 경우
    • Task: w-bit unsigned 정수인 x가 주어졌을 때, 이를 동일한 값을 가지는 (w+k)-bit의 수로 변호나하는 것
    • 더 상위의 k bit를 단순히 0으로 채운다.
    • 예시: 0b0011 -> 0b00000011
  • signed 정수의 경우
    • Task: w-bit signed 정수인 x가 주어졌을 때, 이를 동일한 값을 가지는 (w+k)-bit의 수로 변호나하는 것
    • 더 상위의 k bit를 MSB와 동일한 bit로 채운다.
    • 예시: 0b1101 -> 0b11111101

Truncation

  • Task: (w+k)-bit의 signed 또한 unsigned 정수가 주어졌을 때, 이를 w bit의 정수로 간략화하는 것[6]
  • 최상위 k bit를 삭제한다.


각주

  1. U2B: unsigned 정수를 bit 벡터로 해석 B2S: bit 벡터를 signed 정수로 해석 S2B: signed 정수를 bit 벡터로 해석 B2U: bit 벡터를 unsigned 정수로 해석
  2. 기본적으로 10과 같은 정수 문자열은 signed로 해석된다. 이를 unsigned로 표현하고자 할 때는 10U와 같이 말미에 'U'를 사용하여야 한다.
  3. UAddw(U, V) = (u + v) mod 2w
  4. 양수에서 음수를 뺐을 때
  5. 음수에서 양수를 뺐을 때
  6. 굳이 해당 정수의 값을 유지할 필요는 없다.