
부호가 있는 데이터의 경우 MSB는 부호의 의미를 갖게 된다. MSB가 0이면 양수, 1이면 음수를 나타낸다.
예를 들어 이진수 0b10010000의 경우 부호가 있는 데이터라면, MSB가 1이기 때문에 10진수로 표현하면 음수인 -112가 된다.
0b10010000
부호비트: 1 (음수)
나머지 비트: 0010000
0010000 -> 1101111 + 1 = 1110000
1110000 -> 십진수 변환 = 0*2⁰ + 0*2¹ + 0*2² + 0*2³ + 1*2⁴ + 1*2⁵ + 1*2⁶
= 16+32+64 = 값 -112
만약 부호가 없는 데이터라면 MSB 1은 부호를 의미하지 않고, 값을 의미하므로 양수 144가 된다.
0b10010000
10010000 -> 십진수 변환 = 16 + 128 = 값 : 144
2바이트 이상의 데이터는 메모리에 연속적으로 저장된다. 이때 각 바이트가 메모리에 정렬되는 방식을 바이트 오더링이라고 한다. 바이트 오더링의 두 가지 방식으로 빅 엔디안(Big Endian)과 리틀 엔디안(Little Endian)이 있다.
0x12345678
주소 데이터
-------|-----
0x1000 | 0x12 (가장 큰 바이트)
0x1001 | 0x34
0x1002 | 0x56
0x1003 | 0x78 (가장 작은 바이트)
0x12345678
주소 데이터
-------|-----
0x1000 | 0x78 (가장 작은 바이트)
0x1001 | 0x56
0x1002 | 0x34
0x1003 | 0x12 (가장 큰 바이트)
| 문자열을 메모리에 저장할 때는 바이트 오더링을 고려하지 않고 문자 순서 그대로 메모리에 저장된다.
| 비트 연산자 | 설명 |
|---|---|
| xㅣy | 두 비트 중 하나라도 1이면 결과는 1. (OR) |
| x & y | 두 비트 모두 1이면 결과는 1. (AND) |
| x ^ y | 두 비트가 같다면 결과는 0, 다르다면 1. (XOR) |
| ~x | 비트가 0이라면 결과는 1, 1이라면 결과는 0 (NOT) |
OR (|) 예시| 1 | 1 | 0 | 1 |
|---|---|---|---|
| l | l | l | l |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 |
AND(&) 예시| 1 | 1 | 0 | 1 |
|---|---|---|---|
| & | & | & | & |
| 1 | 0 | 1 | 0 |
| 1 | 0 | 0 | 0 |
XOR(^) 예시서로 같다면 0, 다르다면 1| 1 | 1 | 0 | 1 |
|---|---|---|---|
| ^ | ^ | ^ | ^ |
| 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 1 |
NOT(~) 예시0은 1이 되고, 1은 0이 된다| 1 | 0 | 1 | 0 |
|---|---|---|---|
| ~ | ~ | ~ | ~ |
| 0 | 1 | 0 | 1 |
시프트 연산은 비트를 좌측이나 우측으로 이동시키며, 연산 속도가 빠르고 효율적이기 때문에 특정 작업을 최적화하는데 많이 사용된다.

0000 0000 0110 1000이 되며, 이를 죄측으로 4비트만큼 이동시키면 0000 0110 1000 0000이 되고, 이를 다시 10진수로 변환하면 1664가 된다.10진수 : 104
이진수로 변환 : 0000 0000 0110 1000
4비트만큼 좌측으로 시프트 : 0000 0110 1000 0000
시프트된 이진수를 다시 10진수로 변환 : 1664
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | =104 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| << 4 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | =1664 |
아래 표는 2바이트 크기를 가지는 데이터 20011을 우측으로 4비트만큼 산술 시프트하는 모습을 보여준다. 10진수 20011을 16비트 이진수로 변환하면 0100 1110 0011 0011이 되며, 이를 우측으로 4비트만큼 이동시키면 0000 0100 1110 0011이 되고, 이를 다시 10진수로 변환하면 1267이 된다.
상위 비트(MSB)는 부호 비트를 유지하면서 하위비트(LSB)를 이동시키고, 이동된 자리에는 부호 비트로 채워진다. 10진수 : 20011
이진수로 변환 : 0100 1110 0011 0011
4비트만큼 우측으로 시프트 : 0000 0100 1110 0011
시프트된 이진수를 10진수로 변환 : 1267
| 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | =20011 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| >> 4 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | =1267 |
1111 1111 0001 0001에 4비트만큼 우측으로 논리 시프트를 하는 모습이다. MSB에 상관없이 0으로 채우기 때문에 이진수 0000 1111 1111 0001이 된다.| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | -239 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| >>> 4 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | =4081 |