학습 주제
정수 표현, 변환, 확장, 숫자의 절삭
정리한 내용
2.2 Integer Representations
2.2.1 Integral Data Types
- C에는 다양한 정수형 데이터 타입이 존재
- long은 유일하게 bit 수에 의존적 (32비트와 64비트에서의 범위가 다름)
- 음수의 범위가 1크다 → signed 자료형의 특징
→ 32비트에서의 C 정수형 자료형의 범위
→ 64비트에서의 C 정수형 자료형의 범위
→ C 표준에서의 보장된 범위
- C 표준에서 정의하는 최소한의 범위에서는 고정길이 자료형들을 제외하면 대칭적인 범위를 갖는다.(???) int 자료형은 16비트가 보장되고, long 자료형은 32비트가 보장된다.
2.2.2 Unsigned Encodings
- B2Uw : 이진수에서 길이 w의 unsigned형 정수
- UMaxw = 2^w -1 (나타낼 수 있는 최댓값) = [111…1]
- B2Uw = {0,1}^w = {0, …, UMaxw}
- B2Uw는 일대일 대응 (전단사 함수)
2.2.3 Two’s-Complement Encodings
- B2Tw : 이진수에서 길이w의 2의 보수
- Xw-1 : 부호 비트, 부호 비트의 “weight”는 -2^(w-1)
- B2Uw에서의 “weight”는 +2^(w-1)
- TMinw = -2^(w -1) (나타낼 수 있는 최소값) = [100…0]
- TMaxw = 2^(w -1) -1 (나타낼 수 있는 최댓값) = [011…1]
- B2Tw = {0,1}^w = {TMinw, …, TMaxw}
- B2Tw는 일대일 대응 (전단사 함수)
- w는 생략이 가능
- |TMin| = |TMax| + 1 (비대칭적)
- UMax = 2TMax + 1 (2의 보수 표현에서의 음수는 unsigned에서는 모두 양수가 된다)
- C라이브러리의 <limits.h>에서 정수 데이터 타입의 범위를 정의
- INT_MAX ⇒ TMax, INT_MIN ⇒ TMin, UINT_MIN ⇒ UMin
2.2.4 Conversions between Signed and Unsigned
- casting 시에 비트의 값들은 동일하게 유지한다
- T2U(x) = B2U(T2B(x)) , U2T(x) = B2T(U2B(x)) 를 정의할 수 있다
- T2U(-12345) = 53191, U2T(53191) = -12345
- 12345 + 53191 = 2^16 (weight의 차이)
2.2.5 Signed versus Unsigned in C
- 일반적으로 상수는 signed로 간주된다
- 12345u 처럼 “u”혹은 “U”를 추가하면 unsigned를 선언
→ 명시적 변환
→ 묵시적 변환
- 직관적이지 못한 경우가 생김 (한 쪽이 unsigned이면 둘 다 unsigned로 묵시적 변환)
- -2147483647-1 인 이유?
- a curious interaction between the asymmetry of the two’s-complement representation and the conversion rules of C
2.2.6 Expanding the Bit Representation of a Number
- unsigned 수의 zero extension
- signed 수의 sign extension
- 1을 앞에 붙여도 수가 동일하다! (sign extension이 값을 보존한다)
- 증명 : 직관 or 2^w - 2^(w-1) = 2^(w-1)을 이용
→ (unsigned) (unsigned short) sx
⇒ zero extension
→ (unsigned) sx = (unsigned) (int) sx
⇒ sign extension
2.2.7 Truncating Number(숫자 절삭)
Truncation of an unsigned number(비부호형 절삭)
- 음수 값을 포함x
- B2U는 Binary to Unsinged의 줄임말
- mod는 나머지 구하는 연산자
W개 bit vector에서 K개 bit vector로 비부호형 절삭
- 상단 식의 구체적 풀이 과정(mod는 % 연산자)
- 나머지 연산자를 이용해서 절삭이 이루어진다.
보수란?(Complement number)
- 상호 보완하는 수로, 임의의 수를 보완해주는 다른 임의의 수
- 음수 표현을 위해 사용
- r진법에서 정의되는 보수
r의 보수
▪ A + B 결과값의 각 자리마다 자리올림이 발생하고 해당 자리는 0이 될 때, B를 A에 대한 r의 보수
예) 10진수 (237)10에 대한 10의 보수를 B라고 하면
237 + B = 1000 → B = 1000 -237 = 763
– (r-1)의 보수 ▪ A + B 결과 값의 각 자리가 (r-1)이 될 때, B를 A에 대한 (r-1)의 보수
예) 10진수 (237)10에 대한 9의 보수를 B라고 하면
237 + B = 999 → 237 + B = (1000-1) → B = (1000-1) -237 = 762
r진수에서 (r-1)의 보수
r진법에서 임의의 정수 (N)r이 자릿수가 n개로 구성
(r^n -1) - N
- 10진수에서 9의 보수
- 예) (546700)10에 대한 9의 보수
- (r^n -1) – N = (10^6 – 1) 546700 = 999999 - 546700 = (453299)
- 2진수에서 1의 보수
- 예) (1011001)2에 대한 1의 보수
- (r^n -1)– N = (2 ^ 7 – 1) - 1011001 = 1111111 - 1011001 = (0100110)
- 비트 반전: 0 → 1, 1 → 0
- 2진수에서 2의 보수: 1의 보수로 변환 후 1를 더해준다.
- 2의 보수에서 10진수 변환
−(2^(𝑛−1)) + 절대치 비트(부호 비트를 제외한 나머지 비트들)의 10진수 표현
Truncation of a two’s-complement number(2의 보수 절삭)
- U2T는 Unsinged to two’s complement의 줄임말
- B2T는 Binary to two’s complement의 줄임말
- W개 bit vector에서 K개 bit vector로 2의 보수 절삭
- W개의 bit vector에서 K개의 bit vector로 비부호형 절삭 후 2의 보수화
2.2.8 Advice on Signed versus Unsigned
- 부호형(Signed)을 비부호형(Unsigned)으로 묵시적인 타입 변환을 하면 직관적이지 않은 동작을 보인다.
- 비부호형(Unsigned) 값들은 워드 길이 데이터를 숫자 값으로 해석하지 않고 단지 비트들의 집합으로 생각하려는 경우에 매우 유용하다. Ex) 부울 조건을 설명하는 flag. 주소는 부호가 없기 때문에 비부호형이 유리
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
[CSAPP] 3.1 A Historical Perspective(역사적 관점) (0) | 2023.01.21 |
---|---|
[CSAPP] 2.4 Floating Point(부동소수점) (0) | 2023.01.19 |
[CSAPP] 2.3 Integer Arithmetic(정수 연산) (0) | 2023.01.19 |
[CSAPP] 2.1 Representing and Manipulating Information(정보의 저장) (1) | 2023.01.19 |
[CSAPP] Computer Systems A Programmer's Perspective: 컴퓨터 구조 책 추천 (0) | 2023.01.17 |