2진수, 16진수, 2의 보수
레지스터 값은 16진수로 읽고, 음수는 2의 보수로 저장됩니다. 데이터시트와 디버거 화면을 읽기 위한 숫자 감각.
컴퓨터 안의 모든 값은 0과 1입니다. 32비트를 2진수로 쓰면 너무 길어서 4비트씩 묶어 16진수 한 자리로 씁니다.
| 2진수 | 16진수 | 10진수 |
|---|---|---|
| 0000 | 0 | 0 |
| 1010 | A | 10 |
| 1111 | F | 15 |
0x4002_0014 같은 주소나 0x3C 같은 레지스터 값이 나오면 머릿속에서 4비트씩 펼쳐 봅니다. 0x3C는 0011 1100이니 2~5번 비트가 켜져 있습니다.
2의 보수
음수는 "모든 비트를 뒤집고 1을 더한" 값으로 저장합니다. 8비트에서 -1은 0xFF, -128은 0x80입니다. 이렇게 하면 덧셈 회로 하나로 뺄셈까지 할 수 있습니다.
같은 0xFF가 uint8_t로 읽으면 255, int8_t로 읽으면 -1입니다. 센서가 보낸 16비트 원시값을 부호 있는 자료형으로 받아야 하는 이유가 여기에 있습니다.
int16_t accel = (int16_t)((buf[0] << 8) | buf[1]); // MPU6050 가속도