두 개의 기호를 이용해서 데이터를 표현하는 방식을 2진수라고 한다. 마찬가지로 10개의 기호, 16개의 기호를 사용하여 데이터를 표현하는 것은 각각 10진수와 16진수이다.
2진수는 숫자 기호 0과 1만을 사용하고, 10진수는 우리가 흔히 사용하는 0부터 9까지의 숫자 기호만을 사용한다.
숫자 기호는 0부터 9까지 총 10개만 존재하기 때문에 16진수에서는 알파벳 A부터 F까지의 문자 기호를 추가로 사용한다.
0 1 2 3 4 5 6 7 8 9 A(10) B(11) C(12) D(13) E(14) F(15)
int num1 = 10; // 특별한 선언이 없으면 10진수의 표현
int num2 = 0xA; // 0x로 시작하면 16진수로 인식
int num3 = 012; // 0으로 시작하면 8진수로 인식
위 세 변수는 모두 10으로 초기화된다.
8진수로 10을 표현하려면 자릿수가 증가해야하므로 010(8), 011(9), 012(10) 즉 012가 된다.
C언어는 보통 하나의 정수를 4바이트로 표현한다.
다만 편한 설명을 위해 하나의 정수를 1바이트로 표현하겠다.




하지만 결과는 10의 근사치로 나온다.&연산은 두 개의 비트가 모두 1일때 1을 반환하는 연산이다.
1 & 1 일 때만 1을 반환하고, 0이 하나라도 있으면 0을 반환한다.
|연산은 두 개의 비트가 모두 0일 때 0을 반환하는 연산이다.
0 | 0 일 때만 0을 반환하고, 1이 하나라도 있으면 1을 반환한다.
^연산은 두 개의 비트가 서로 다른 경우에 1을 반환하는 연산이다.
~연산은 단항 연산자로서 비트를 0에서 1로, 1에서 0으로 반전시키기 때문에 보수 연산이라고도 불린다.
NOT연산은 MSB도 반전되어 부호마저 바뀜에 조심해야한다. 2진수로 표현된 음의 정수는 2의 보수를 취한 후 크기를 확인해야한다.
<<연산자는 두 개의 피연산자를 필요로 한다.
비트의 이동으로 인해서 생기는 오른쪽 빈 칸은 0으로 채워지고, 이동으로 인해서 밀려나는 왼쪽 비트들은 버려진다.
실행 결과를 보면 다음과 같은 결론을 얻을 수 있다.
비트의 열을 왼쪽으로 1칸씩 이동시킬 때마다 정수의 값은 두 배가 된다.
비트의 열을 오른쪽으로 1칸씩 이동시킬 때마다 정수의 값은 2로 나누어진다.
이동으로 인해 밀려나는 오른쪽 비트들은 벼려질 것이고, 왼쪽의 빈자리는 0으로 채워질 것이다. MSB가 0이라면 >>연산을 실행했을 때 별다른 문제가 없지만, MSB가 1이라면 어떻게 될까?
이는 CPU에 따라서 결과가 달라진다.
음의 값을 유지하기 위해 1을 채우는 CPU가 있고, 상관하지 않고 0을 채우는 CPU도 있다.

내 컴퓨터는 음의 값을 유지한다.