컴퓨터의 정수표현(unsigned, signed, 보수)

Ilhoon·2022년 1월 18일
1

개발자의 기본기

목록 보기
2/6

정수

부호의 존재 여부에 따라 표현가능한 범위가 달라진다.

비트 수에 따라 다양한 자료형으로 사용가능하고 표현가능한 수의 범위도 달라진다.

  • 8비트 - char - 2^8개 표현가능
  • 16비트 - short - 2^16개 표현가능
  • 32비트 - int - 2^32개 표현가능
  • 64비트 - long - 2^64개 표현가능

Unsigned (자연수)

  • 음수를 허용하지 않는 자료형

  • Unsigned char 라고 가정하면 표현 가능 범위는 0 ~ 255 (2^8)

  • Unsigned char 자료형끼리 연산결과를 같은 자료형에 대입하려고하면

    • 11111111 (255) + 00000001(1) => 100000000
      • 9비트가 필요
      • 오버플로발생!
      • 넘친 값은 버리고 실제 이 연산의 결과는 0이 된다.
        - 1(버려짐) // 00000000(실제결과)
    • 01011111 (95) - 10001011 (117) = 11101010 (234)
      • 기대값은 -22였지만 실제 결과는 234 (256 + 95 - 117)
      • 언더플로발생

signed (정수)

  • 음수도 표현 가능한 자료형

  • 부호를 어떻게 표현할까?

    • 처음 1비트를 부호표현에 사용한다(양수:0, 음수:1) + 숫자 7비트

    • 8비트로 표현 가능한 정수의 범위

      • (-)2^7 + (+)2^7 = (-127 ~ 0) ~ (0 ~ 127)
      • 00010001 (17) + 01111100 (124) = 141
        • 8비트 부호있는 정수의 표현 범위를 넘어버린다. (오버플로 : 최대값 보다 클 경우)
        • 음수 값이 나와버린다.
      • 11111000 (-120) + 10001010 (-10) = -130
        • 8비트 부호있는 정수의 표현 범위를 넘어버린다. (언더플로 : 최소값 보다 적을 경우)
    • 보수

      • 10의 보수 : 10^n이 되기 위해 필요한 수

        • 2의 10의 보수 = 8
        • 12의 10의 보수 = 88
        • 10의 보수를 구하는 가장 쉬운 방법 (숫자가 클수록)
          • 9의 보수를 구한 다음 1을 더한다
      • 9의 보수 : 9가 되기 위해 필요한 수 (10^n - 1)

        • 483의 9의 보수 = 516
        • 즉, 모든 자리 수가 9가 되게 만드는 데 필요한 수
      • 자리수가 고정되어있는 경우 보수를 이용한 뺄셈이가능하다.

      • 아래의 예시는 4자리만 표현가능한 계산기에서 보수를 이용한 10진수 뺄셈.

        • 10진수
          • 0012 - 0003
          • 0012 + (10000 - 0003)
          • 0012 + 9997 (-3의 10의 보수)
          • 10009 (오버플로)
          • 0009 = 9
      • 1의 보수 (2진법)

        • 모든 자리수가 1이 되게 만드는 데 필요한 수

        • 각 비트를 뒤집으면 됨

        • 한계점 : 0이 2개다, 약간의 예외상황이 있음

        • 2진수10진수2진수10진수
          0000 000001111 1111-0
          0000 000111111 1110-1
          0000 001021111 1101-2
          ............
          0111 11101261000 0001-126
          0111 11111271000 0000-127
      • 2의 보수 (2진법)

        • 2진법에서 2는 2진수 10을 의미한다. 즉 2의 보수는 한 자리 올라가게 만드는 수

        • 현재 가장 널리 쓰이는 방법

        • 2의 보수 구하는 쉬운 방법

          • 1의 보수 구한 다음 1을 더하면 된다.
        • 0을 한번만 사용하기 때문에 -128까지 표현 가능하다.

        • 2진수10진수2진수10진수
          0000 00000
          0000 000111111 1111-1
          0000 001021111 1110-2
          ............
          0111 11101261000 0010-126
          0111 11111271000 0001-127
          1000 0000-128
        • 아래의 예시는 4자리만 표현가능한 계산기에서 보수를 이용한 2진수 뺄셈.

        • 2진수
          • 1100 - 0011
          • 1100 + (10000 - 0011)
          • 1100 + 1101 (-0011의 2의 보수)
          • 11001 (오버플로)
          • 1001 = 9
      • 음수를 보수로 표현할 수 있고! 컴퓨터는 2의 보수로 음수를 표현한다

profile
꾸준하게!

0개의 댓글