목차
이 글에선 저번 글에 이어서, 형식 지정자에 따라 (signed int, unsigned int) 정수가 어떻게 달라지는 지 좀 더 자세히 기술에 보겠다.
Number System.
먼저 심화 정수 내용을 알려면, 진법에 대해 살짝이라도 감이 있어야 한다.
우리는 일상생활에서 10진법을 쓰지만, (숫자 총 0~9, 10개 사용)
컴퓨터는 0과 1로만 이루어진 2진법을 쓴다. 우리가 2라고 썻지만, 컴퓨터는 10으로 알아듣는 것을 염두해두자.
실제로 6+7의 경우 컴퓨터는 각 숫자를 이진법으로 전환하여 계산한다.
정수를 리터럴로 써줄 때, 십진법이 아닌, 2진법/8진법/16진법으로 표기할 수도 있다.
- 앞에 0이 달리면 8진수 / octa
- 앞에 0b가 달리면 2진수 / binary
- 앞에 0x가 달리면 16진수 / hexa
- 앞에 아무것도 안달리면 기본 10진법이다. 예: int num = 5;
만약 int num = 05; 라고 하면 컴퓨터가 8진법 5로 알아들으니 주의.
정수 Type Specifier에 따라 세분화:
Unsigned Integer
아래는 부호없는 정수로 여러 진법의 숫자를 나타낸 것이다.
int8_t가 signed int의 고정사이즈 자료형이라면. uint8_t는 unsigned int의 고정사이즈 자료형이다. 8비트
8비트란 8개 칸이 있다는 뜻이다.
8비트에선 최댓값이 255다.
(단순히 생각하면 2^8인 256이라고 생각할 수 있는데, 아니다. 왜냐면. 첫번쨰 칸은 2^0부터 시작하기 때문에 실제로는 2^7에서 끝난다. 255 = 2^7 +2^6 +2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 )
마찬가지로
16 비트는 16개칸이 있고 2^16 -1 = 65535가 최댓값
32 비트는 32개칸이 있고 2^32 -1 = 4394967295가 최댓값 (약 43억)
Signed Integer
부호가 있는 경우 조금 더 복잡하다.
8비트, 8개 칸이 주어진 것은 여전하다. 하지만, 이 칸 전부를 숫자값으로 못 쓴다. 8개 칸 중 맨 왼쪽은 MSB(most sigfnicicant digit) aka signed bit 라고 부르며 부호를 나타내야 하기 때문이다. 이녀석이 1이면 음수를 의미한다.
하지만 [1][0][0][0][0][0][0][1]은 -1을 말하지 않는다. [1][0][0][0][0][0][0][0]이 -0이라고 하기엔 이상하니까.
마이너스의 경우엔 보수라는 것을 사용한다. 양수에서 2의 보수를 취한 값이 음수가 되는 것이다.
2의 보수란 각 비트를 반전시키고 1을 더한 것을 말한다.
예를 들어 3을 구하고자 할 때:
[0][0][0][0][0][0][1][1] = 3
[1][1][1][1][1][1][0][0] 반전
[1][1][1][1][1][1][0][1] 1 더하기
즉 11111101이 -3을 의미한다.
11111101을 다시 역순으로 1을 빼고 반전하면 00000011 3이 나오는 것을 알 수있다.
8 비트 signed는 맨 왼쪽이 부호자리이기 때문에 7개자리밖에 못 써서, 그래서 255가 아닌 2^7 - 1 = 127이 최댓값이다.
하지만 최솟값은 -127이 아니라 -128이라는것을 유의하자.