В основному кожен сучасний комп’ютер - це машина, що підштовхує біт. Зазвичай він натискає на біти в кластерах даних, що називаються байтами, словами, dwords або qwords.
Байт складається з 8 біт, слова 2 байтів (або 16 біт), слова 2 слова (або 32 біта) і 2 слова (або 64 біта). Це не єдиний спосіб впорядкувати біти. 128-бітова і 256-бітова маніпуляція також відбувається, часто в інструкціях SIMD.
Інструкції по збірці діють на регістри, а адреси пам'яті, як правило, працюють в одній з вищевказаних форм.
АЛУ (арифметичні логічні одиниці) працюють на таких пучках бітів, як якщо б вони представляли цілі числа (зазвичай формат Доповнення двох), а ФПУ так, ніби вони там, де знаки з плаваючою комою (як правило, стилі IEEE 754 float
та double
). Інші частини будуть діяти так, ніби вони вбудовані в певний формат, символи, записи в таблиці, інструкції CPU або адреси.
На типовому 64-бітному комп’ютері пакети з 8 байтів (64 біт) - це адреси. Ми відображаємо ці адреси умовно як у шестигранному форматі (як 0xabcd1234cdef5678
), але це просто простий спосіб для читання бітових моделей. Кожен байт (8 біт) записується у вигляді двох шістнадцяткових символів (еквівалентно кожен шістнадцятковий символ - 0 до F - являє собою 4 біти).
Що насправді відбувається (на деякому рівні насправді), це те, що є біти, які зазвичай зберігаються в реєстрі або зберігаються в сусідніх місцях у банку пам'яті, і ми просто намагаємось описати їх іншому людині.
Після вказівника складається з того, щоб попросити контролер пам'яті надати нам деякі дані в цьому місці. Ви, як правило, запитуєте в контролер пам'яті певну кількість байт у певному місці (ну, неявно діапазон локацій, як правило, суміжних), і він доставляється через різні механізми, в які я не потрапляю.
Код зазвичай визначає призначення для даних, до яких потрібно отримати - реєстр, іншу адресу пам'яті тощо - і зазвичай погана ідея завантажувати дані плаваючої точки в регістр, що очікує ціле число, або навпаки.
Тип даних у C / C ++ - це те, що компілятор відстежує, і він змінює, який код генерується. Зазвичай в даних немає нічого суттєвого, що робить його фактично будь-якого одного типу. Просто колекція бітів (впорядкованих у байти), якими маніпулює цілим способом (або плаваючим способом, або адресовим способом) кодом.
З цього є винятки. Є архітектури, де певні речі є різними видами бітів. Найпоширеніший приклад - захищені сторінки виконання - в той час як вказівки, які вказують процесору, що робити, це біти, під час виконання сторінки (пам'ять), що містять код для виконання, позначені спеціально, не можуть бути змінені, і ви не можете виконувати сторінки, які не позначені як сторінки виконання.
Також є лише дані для читання (іноді зберігаються в ПЗУ, які фізично неможливо записати в!), Проблеми з вирівнюванням (деякі процесори не можуть завантажувати double
s з пам'яті, якщо вони не вирівняні певним чином, або інструкції SIMD, які потребують певного вирівнювання), і безліч інші вигадки архітектури.
Навіть вищевказаний рівень деталізації - брехня. Комп'ютери не "насправді" нагнітаються навколо біт, вони дійсно штовхають напруги та струм. Ці напруги та струм іноді не роблять те, що їм "належить" робити на рівні абстракції біт. Мікросхеми призначені для виявлення більшості таких помилок і виправлення їх, без абстракції вищого рівня.
Навіть це брехня.
Кожен рівень абстракції приховує рівень нижче, і дозволяє подумати над вирішенням проблем, не маючи на увазі діаграм Фейнмана, щоб роздрукувати "Hello World"
.
Тож при достатньому рівні чесності комп'ютери натискають біти, і цим бітам надається сенс у тому, як вони використовуються.