Bagaimana informasi disimpan?

5

Di masa lalu 8 bit informasi dan 8 bit komputer rukun

Ada ASCII 8 bit sehingga byte tunggal adalah char tunggal dan posisi tunggal dan seluruh dalam memori / disk

kemudian datang komputer 16 bit, 32 bit, dan 64 bit tapi saya kehilangan jalan

bagaimana karakter disimpan? Apakah ASCII 16/32/64 bit digunakan ??

bagaimana jika saya memiliki data lebar 8 bit? dapatkah saya menyimpan Banyak karakter dalam satu posisi?

misalnya untuk 32 bit, jika hanya 8 bit yang digunakan, ada 24 bit yang tidak digunakan?

memori / posisi disk-> 0000000 00000000 0000000 xxxxxxx

atau apakah memori 16/32/64 arah / disk masih terus menunjuk ke 8 bit, bukan 16/32/64-bit-kata?

jadi 8 bit masih hidup dan menendang? sepertinya YA

SUNTING

Lupa tentang ASCII, saya ingin tahu apakah satu alamat (dalam memori / disk) menunjuk ke byte 8 bit tunggal dalam platform 8/16/32/64 bit

Hernán Eche
sumber
Ini tidak menjawab pertanyaan Anda, tetapi berdasarkan pada beberapa hal yang Anda tanyakan (dan beberapa orang yang telah memberikan jawaban kepada Anda) perlu membaca ini: joelonsoftware.com/articles/Unicode.html
ubiquibacon

Jawaban:

5

Jika lebih dari 8 bit, sebuah karakter bukan ASCII menurut definisi. Angka masih angka.

Bytes masih byte. Komputer dengan jalur data yang lebih luas hanya mengambil lebih banyak pada saat yang bersamaan. Sistem 32-bit akan memanipulasi 4 byte sekaligus, dan komputer 64-bit akan menggunakan 8 byte.

Bagaimana disk mengelola data adalah masalah yang terpisah - disk akan mengerjakannya sendiri secara internal dan merespons antarmuka (SATA dll) dengan potongan data berukuran tepat.

DaveE
sumber
1
+1 untuk menyebutkan karakter selain ASCII. Unicode saat ini sangat umum dan karakter UTF-8 misalnya dapat mengambil antara 1 dan 4 byte.
AndrejaKo
"Memanipulasi 4 byte sekaligus secara native" tidak jelas bagi saya. Lupa tentang ASCII, saya ingin tahu apakah satu alamat (dalam memori / disk) selalu menunjuk satu byte saya akan memasukkan ini dalam pertanyaan
Hernán Eche
>> jika satu alamat (dalam memori / disk) selalu menunjuk satu byte ... Tergantung pada tipe data. Byte tunggal dapat dialamatkan - pikirkan tipe CHAR, tetapi pointer pada sistem 32-bit adalah 4 byte, dan seterusnya. Jadi ya itu bisa terjadi tetapi "itu tergantung" ketika Anda berbicara tentang alamat tertentu (mungkin alamat itu adalah sesuatu dalam suatu program).
DaveE
jadi jawabannya adalah TIDAK, itu tidak selalu menunjuk satu byte karena ada beberapa perangkat keras yang memiliki lebar data minimal yang lebih luas, tetapi di dalam perangkat keras PC, akses minimal adalah 8 bit
Hernán Eche
2

Ukuran ruang alamat dalam byte. Misalnya, Anda membeli komputer dengan 4GB RAM, atau 3TB disk. Jadi alamat juga menunjuk ke satu byte.

Saat menangani lebih dari 8 bit, Anda juga mereferensikan byte yang mengikuti. Misalkan Anda memiliki pointer ke alamat 104. Jika Anda memuat ke register 64-bit, Anda mendapatkan byte 104 hingga 111. Jika Anda menyimpan, Anda menimpa alamat tersebut.

Pertanyaan dasar Anda tentang bagaimana data karakter disimpan dalam memori, baik dalam RAM dan di-disk? Secara umum, data dalam memori kerja membutuhkan lebih banyak ruang tetapi lebih mudah untuk dikerjakan; sementara pada disk lebih kompak, dengan semacam pengkodean karakter . Tetapi ada banyak variasi, dan pro dan kontra untuk mereka.

Sebagai contoh, tidak biasa bagi karakter untuk selalu mengambil masing-masing dua byte dalam memori, tetapi ketika disimpan dalam disk, ambil satu hingga empat byte. Misalnya "ABC" dalam memori: 65 00 66 00 67 00; pada disk: 65 66 67. Untuk karakter khusus yang dikenal sebagai Byte Order Mark, dalam memori: 255 254; pada disk: 239 187 191. Ini adalah karakter Unicode, disimpan dengan pengkodean UTF-8 pada disk.

(Dan secara teknis, ASCII adalah 7-bit; ia hanya mendefinisikan 128 karakter. Unicode adalah superset ASCII 16-bit.)

Ken
sumber
ok, karena ukurannya ditentukan dalam bytes maka 8 bit masih hidup =) dan akan bersama kita untuk waktu yang lama
Hernán Eche
Bagaimana Notepad membedakan satu karakter UNICODE dari empat byte ASCII ??
Hernán Eche
1
Untuk aliran teks apa pun, pengkodean karakter harus diekspresikan entah bagaimana, baik dalam aliran (dekat awal) atau di luarnya (seperti properti file); jika tidak, beberapa default diasumsikan, seringkali didasarkan pada lokal saat ini (negara dan bahasa). Kehadiran karakter Byte Order Mark khusus yang saya sebutkan akan membantu Notepad menebak . Jika pengkodean karakter yang salah diterapkan, Anda mungkin mendapatkan karakter yang salah, dari beberapa hingga semuanya.
Ken
1

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.

dengan cepat_now
sumber
1

RAM saat ini, seperti halnya RAM pada tahun 1970-an, masih dapat diatasi dengan 8 bit pada suatu waktu. Jadi setiap alamat memori menunjuk ke byte 8-bit.

Ketika CPU 16-bit dikembangkan, mereka mempertahankan kemampuan untuk mengatasi 8 bit sekaligus untuk keperluan kecepatan dan kompatibilitas. Ada berbagai komponen dari CPU yang dapat memiliki "bitness," lebar register adalah salah satunya. Tetapi hampir semua CPU 16-bit atau lebih besar memiliki instruktur untuk mengakses register 8 bit atas atau bawah. Jadi, hanya karena CPU begitu banyak bit tidak berarti harus mengakses memori atau register dalam ukuran potongan itu.

Jadi untuk menjawab pertanyaan Anda:

Apakah 16/32/64 arah memori / disk masih terus menunjuk ke 8 bit, bukan 16/32/64-bit-kata? Iya. CPU 32-bit memuat 32 bit ke dalam register dari lokasi memoy yang diberikan akan mengambil 4 byte dari DRAM dan memasukkannya ke dalam register.

8 bit masih hidup dan menendang? Iya. Motorola 68000 CPU, sementara itu chip 16-bit (beberapa akan berdebat 32-bit), memiliki instruksi yang disebut ADDQ (untuk ADD QUICK) yang akan mengambil operan dari register atau memori dan menambahkannya ke 8-bit nilai sebenarnya dikodekan dalam instruksi itu sendiri. Saya tidak tahu terlalu banyak tentang perakitan x86 tapi saya yakin ada instruksi serupa yang membatasi kecepatan 8 bit.

LawrenceC
sumber
0

64 bit CPU mampu mengatasi data 8 bit.

Satu chardisimpan pada satu byte.

mouviciel
sumber
Ohh jadi 8 bit masih hidup dan menendang!
Hernán Eche
Benar untuk chardalam C, tetapi tidak harus bahasa lain.
Ken
sekali lagi, lupakan tentang tipe data, pertanyaannya adalah tentang bit
Hernán Eche