[TIL] CSAPP 2.2 키워드

zxcv·2025년 5월 24일

2.2

컴퓨터 시스템에서는 크게 signedunsigned 자료형이 있는데 두 차이는 정수만 의미 하는지(0~255) 음수+정수 의미 하는지의 (-127 ~ 127) 차이.

부호 구분별 타입이 중요한 이유

1byte는 256가지의 수를 가질 수 있는 공간.
음수가 필요없는 시스템에서 signed 자료형을 쓴다면 메모리의 반절을 손해보는 것.

int64_t,int32_t,int16_t,in8_t,int4_t 차이

단순 bit공간 차이 각 뒤 숫자만큼에 bit를 사용할수 있는 공간을 의미함.

signed - Binary to Two's Complement(B2T)
unsigned - Binary to Unsigned(B2U)

B2T 계산

Binary: 1011 1001
B2T: -2^7 + 2^5 + 2^4 + 2^3 + 1= −128+32+16+8+1 = −71

책에서 하도 어렵게 써놨는데 그냥 맨앞비트가 있으면 -2^자릿수 하면 된다.

값 이름공식예: 8비트 기준
TMin−2^(w−1)−128 (10000000)
TMax2^(w−1) − 1127 (01111111)
UMax2^w − 1255 (11111111)

TMin = 부호형 최소값
TMax = 부호형 최대값
UMax = 비부호형 최대값

#include <stdint.h>
#include <stdio.h>

int main(){

    int8_t a = 127;
    int8_t b = 128;
    int8_t c = 129;

    printf("a = 127 : %d \n ",a);
    printf("b = 128 : %d \n ",b);
    printf("c = 129 : %d \n ",c);
    



    return 0;
}

참고만하자..
앞서 설명한 것은 2의 보수로 부호를 표현한 식이고
1의 보수로도 표현한다고 하는데 거의 모든 컴퓨터 시스템에서 2의 보수를 쓴다고 하니 굳이 알아보진 말자

비트확장 2.2.6

C에서 비트 확장은 데이터를 더 큰 자료형으로 이식할 때, 사용한다.

int8_t a = -15;      // 8비트 signed
int16_t sa = a;      // 16비트 signed ← 자동 sign-extension

라는 형변환이 필요할때 C에서 자동으로 늘어난 만큼 비트를 채워준다.
(앞 부호에 따라서 비트가 채워짐)
8bit: 0011 1111
16bit확장: 1111 1111 0011 1111

int16_t sa = (a & 0x80) ? (0xFF00 | a) : a;

내부적으로 위에 과정과 같이 채워진다고 한다.

비트자르기 2.2.7

비트 확장과 반대로 큰 수에서 작은 수로 비트를 쪼개서 쓰고 싶을 때 사용한다.

16bit: 0000 1111 1111 0001
8bit: 1111 0001

16bit -> 8bit 으로 쪼갠다면 하위 8bit만 사용

int16 x = 0x0FF1;   // 16비트 값: 0x0FF1 = 4081
int8_t y = (int8_t) x; // y == 0xF1 == -15 (2의 보수로 해석됨)
profile
일단함

0개의 댓글