Semuanya sedikit lebih rumit daripada jawaban sederhana yang diberikan sejauh ini.
Ada 2 aspek: Mesin, dan penyimpanan massal.
Di Mesin:
Itu tergantung pada arsitektur perangkat keras.
Pada PC, pengalamatan adalah dengan byte, dan Anda dapat mengakses byte (8 bit), kata (16 bit), kata ganda (32 bit), dan kata kunci (64 bit).
Pada arsitektur lain, Anda mungkin hanya memiliki akses ke "gumpalan" berukuran lain untuk tipe data mesin. Misalnya pada TMS320C40 Anda dapat mengakses 32 bit kata, dan 8 bit byte dimasukkan ke dalam kata-kata ini. Anda dapat mengemas byte masuk dan keluar, tetapi prosesnya cukup lambat yang membutuhkan beberapa instruksi mesin.
Jadi pada TMS320C40 kompiler C memiliki tipe char asli yaitu 32 bit!
(Ketika pemrograman dalam C, jangan pernah berasumsi bahwa char adalah 8 bit. Baca manual kompiler Anda, terutama jika melakukan pemrograman tertanam).
Hal-hal menjadi lebih rumit ketika endian-ness ikut bermain, ada 2 pengaturan umum: sedikit dan big endian, ini menggambarkan bagaimana byte diatur agar sesuai dengan jumlah yang lebih besar (biasanya mesin itu menggunakan ukuran kata asli). Jadi misalnya, pada mesin 32 bit Anda mungkin menemukan byte mengatur seperti ini:
Alamat X: Byte 0, Byte 1, Byte 2, Byte 3
Alamat X + 4: Byte 4, Byte 5, Byte 6, Byte 7
ATAU
Alamat X: Byte 3, Byte 2, Byte 1, Byte 0
Alamat X + 4: Byte 7, Byte 6, Byte 5, Byte 4
(Dan itu menjadi lebih kompleks karena bit dalam byte juga memiliki endian-ness.)
Sebagian besar hal seperti ini hanya muncul sebagai kekhawatiran bagi para perancang perangkat keras. Tetapi jika Anda harus menulis driver perangkat dan hal-hal yang berbicara dengan perangkat keras yang melalui register yang dipetakan memori, itu menjadi masalah besar.
Contoh sederhana dapat mencukupi:
Membuang satu blok memori pada alamat X mungkin menyajikan aliran byte:
01 02 03 04 05 06 07 08
TETAPI membuang blok yang sama dari alamat yang sama dan menampilkan bilangan bulat 16 bit (hex) dapat ditampilkan sebagai:
0201 0403 0605 0807
Dan dumping lagi dari alamat yang sama dengan integer 32 bit di hex mungkin hadir sebagai:
04030201 08070605
Hal ini menyebabkan kebingungan dalam jumlah besar bagi yang belum tahu, karena semuanya tergantung pada endian-ness, dan metode (urutan byte) yang digunakan untuk membuat jumlah yang lebih besar dari yang lebih kecil.
Secara umum bahasa tingkat tinggi menyembunyikan tingkat keburukan ini, tetapi bisa penting untuk hal-hal seperti overlay struktur data, dan, sekali lagi, register kontrol perangkat yang dipetakan memori.
Penyimpanan massal.
Untungnya di sini, hidup jadi lebih mudah.
Anggap saja penyimpanan massal Anda sebagai banyak byte, yang dapat diakses, dan mesin secara ajaib akan mengurus semuanya. Istilah umum yang digunakan untuk hal file sebagai "aliran", di mana Anda mulai di awal dan aliran datang bergulir. (Ini nyaman mengabaikan akses acak.) Bagian terkecil Anda dapat memecah aliran file ke dalam adalah byte.
Jika sebuah mesin ingin menyimpan jumlah yang lebih besar (kata-kata 16 bit, dll), maka mungkin atau mungkin tidak melakukan beberapa tingkat transformasi untuk memasukkannya ke dalam byte yang pergi ke penyimpanan.
Peringatan.
Semua hal di atas berkaitan dengan hal-hal yang mendasari level rendah - byte, kata-kata, dan sebagainya.
Program memanfaatkan ini dalam segala macam cara. Jadi misalnya Anda akan mendapatkan KARAKTER yang diwakili oleh byte jika cocok dengan ASCII (atau bahkan EBCDIC bagi mereka yang memiliki memori panjang). Sistem karakter Unicode modern dapat menggunakan Karakter Lebar (umumnya ini 16 bit), tetapi ada banyak sistem pengkodean untuk unicode. Halaman Wikipedia di Unicode cukup instruktif.
Konvensi dalam C menganggap CHARACTER = BYTE adalah hari-hari ini, menyesatkan dan salah arah. Yang terbaik untuk hal "char" adalah sinonim untuk "byte" - kecuali mesin Anda / compiler mengatakan sebaliknya (lihat di atas). BAIK C program umumnya mendefinisikan satu set jenis yang disukai seperti "UINT8" - integer 8 bit unsigned, "SINT8" - menandatangani integer 8 bit, dan seterusnya, sehingga program yang ditulis menjadi independen seperti masuk akal mungkin dari kekhasan dari kompiler khusus dan perangkat keras yang mendasarinya.
Untuk pertanyaan spesifik: Bagaimana cara karakter disimpan? Jawabannya adalah, tergantung. Seringkali, karakter ascii yang sesuai dengan byte disimpan sebagai byte. Karakter lebar sering disimpan sebagai kata 16 bit. Tetapi unicode mungkin mengimplementasikan karakter lebar atau salah satu dari sejumlah sistem pengkodean, di mana karakter kasus dapat menempati dari 1 hingga sekitar 4 byte, tergantung pada karakter.