현대의 컴퓨터는 비트라고 부르는 두 개의 값을 갖는 신호로 표현되는 정보를 저장하고 처리한다.
메모리에 저장된 각각의 비트들을 접근하는 방식 대신에 대부분의 컴퓨터들은 메모리에서 주소 지정이 가능한 최소 단위인 8비트 단위의 블록인 바이트를 사용한다.
기계수준의 프로그램은 가상 메모리라고 하는 거대한 바이트의 배열로 취급한다.
메모리의 각 바이트는 주소라고 하는 고유한 숫자로 식별할 수 있으며, 모든 가능한 주소들의 집합을 가상 주소공간이라고 부른다.
C에서 어떤 포인터의 값은 정수, 구조체, 다른 프로그램 객체 등 유형에 관계없이 저장장치의 동일한 블록의 첫 바이트의 가상주소가 된다.
포인터는 배열과 같은 자료 구조의 원소를 참조하는 방법을 제공한다.
포인터는 변수처럼 값과 자료형 두 개의 측면을 가지고 있다.
값은 객체의 위치를 가리키는 반면, 자료형은 어떤 객체가 그 위치에 저장되어 있는가를 나타낸다.
1바이트는 8비트로 이루어진다.
16진수는 0에서 9까지의 숫자와 A에서 F까지의 문자를 사용해서 16개의 가능한 값을 나타낸다.
C에서 0x나 OX로 시작하는 숫자 상수들은 16진수로 해석한다.
예를 들면, 16진수 0x173A4C를 0001/0111/0011/1010/0100/1100 이진수 형태로 변환할 수 있다.
모든 컴퓨터는 워드 크기(word size)를 규격으로 가지게 되는데, 이것은 포인터의 정규 크기를 표시한다.
하나의 가상주소가 이와 같은 한 개의 워드로 인코딩되기 때문에 이 워드 크기가 결정하는 가장 중요한 시스템 변수가 가상 주소공간의 최대 크기이다.
32비트 워드 크기는 가상 주소공간의 크기를 4기가바이트로, 64비트 워드 크기로 확장하게 되면서 16엑사바이트의 가상 주소공간으로 확장한다.
64비트 컴퓨터들은 역방향 호환성을 가지고 있어서 32비트 머신들을 위해 컴파일된 프로그램들도 실행할 수 있다.
어떤 프로그램이 실행되는 머신의 종류가 아니라 프로그램이 어떻게 컴파일되었는가에 따라 "32비트 프로그램" 또는 "64비트 프로그램"이라고 부른다.
64비트 워크 크기를 가지는 컴퓨터에서 short는 2바이트, int32_t, int와 float은 4바이트, int64_t, long과 double은 8바이트를 사용한다.
정수 데이터는 0과 음수, 양수를 표시하기 위해서 부호형(signed) 정수가 되거나 양수 값만을 나타내는 비부호형(unsigned) 정수가 될 수 있다. C 데이터 타입 char은 한 개의 바이트를 나타낸다.
가장 덜 중요한 바이트가 먼저 오는 방식을 리틀 엔디안, 가장 중요한 바이트가 먼저 오는 방식을 빅 엔디안이라고 부른다.
안드로이드와 IOS는 리틀 엔디안 모드로만 동작한다.
C애서는 배열 표시를 사용해서 포인터를 역참조(dereferencing)할 수 있으며, 배열의 원소는 포인터 표시로 참조할 수 있다.
C의 "주소화" 연산자 &는 포인터를 만들어 낸다.
캐스트 연산자는 하나의 데이터 타입을 다른 타입으로 변환해준다.
컴퓨터는 정보를 비트로 인코딩하며, 이들은 일반적으로 연속된 바이트들로 구성된다.
여러가지 컴퓨터들은 숫자를 인코딩하고 다중 바이트 데이터 내의 바이트 순서를 정하는 데 서로 다른 모델을 사용한다.