Якщо 32-розрядні машини можуть обробляти лише цифри до 2 ^ 32, чому я можу написати 1000000000000 (трильйон) без мого збою?


370

32-бітні комп’ютери можуть зберігати лише підписані цілі числа до 2 31 - 1.
Ось чому у нас не вистачає IPv4-адрес і вступили в 64-бітну епоху.

Однак число 2 31 - 1 (2,147,483,647) не настільки велике, як число 1 трильйон (1 000 000 000 000), яке, здається, зможе відобразити штрафи без моєї машини.

Хтось може пояснити, чому це?


35
Питання хибне. 32-бітні машини можуть обробляти числа, набагато більші за 2 ^ 32. Вони роблять це постійно, з "довгими" тощо. Вони можуть зберігати до 2 ^ 32 в одному реєстрі, але програмне забезпечення написане для обходу цієї проблеми. Деякі сучасні мови навіть не мають проблеми з довжиною заданого числа.
JFA

23
Будь ласка, залишайте коментарі на теми, ввічливі та відповідні технічним аспектам питання. Майже 50 жартівливих коментарів уже потрібно було видалити, і ми хотіли б уникати публікації. Дякую.
nhinkle

6
Це запитання було написано трохи неохайно. Що ви маєте на увазі під «записом» та «відображенням» числа 1000000000000? Коли ви писали запитання, ви написали номер 1000000000000, і ваш веб-браузер відображає його добре, я вважаю, але це не повинно бути нічого дивного для тих, хто коли-небудь використовував комп'ютер раніше. Питання вимагає вільного тлумачення.
HelloGoodbye

7
Оцінка людської свідомості вміщає близько 50 біт (я десь читав). Тож питання не в тому, "Як я можу писати 10^9без збоїв на ПК?" а скоріше "Як я можу писати 10^(18)без мого мозку?"
Хаген фон Ейтцен

1
32-бітні комп’ютери можуть зберігати лише невідомі цілі числа до 2 ^ 32 - 1. 2 ^ 32 - 1 навіть не дорівнює 2,147,483,647 ... 300 голосів і ніхто цього не усвідомлював?
Корай Тугай

Відповіді:


784

Я відповідаю на ваше запитання, задаючи вам інше:

Як ви рахуєте на пальцях до 6?

Ви, ймовірно, однією рукою підраховуєте до максимально можливого числа, а потім переходите до другої руки, коли у вас закінчуються пальці. Комп'ютери роблять те саме, якщо їм потрібно представити значення, яке перевищує один реєстр, вони використовуватимуть кілька 32-бітових блоків для роботи з даними.


16
Смішно, @codename. Як тоді ви рахуєте на пальцях до 32 і більше (тобто раз 2 ^ 5 вичерпано)? ;) Аналогія переходу до іншої руки хороша ... навіть якщо двійковий затримує потребу перейти до іншої руки. Що я хотів би бачити - це нарахування до 1,024 або більше, коли спритність педалі переходить до пальців ніг для подальшого підрахунку у двійковій формі - до 1,048,575! :) Це потенційно 20 біт потужності дочірньої плати. : P
J0e3gan

14
Будь ласка, залишайте коментарі з теми та мають відношення до технічних аспектів цієї відповіді. Більше 60 коментарів жарту вже видалено з цієї відповіді, і ми хотіли б уникнути необхідності блокувати публікацію.
nhinkle

@ codename - просто, ви вказуєте один палець як вказівник стека. Як тільки у вас не вистачає пальців, ви додаєте суму до стеку і перезапускаєте підрахунок.
Макач

Де ти це дізнався, @codename? Я чув це першим від Фредеріка Поля, дивіться, наприклад, тут hjkeen.net/halqn/f_pohl3.htm
Зейн

2
Я думаю, це не відповідь на відповідне питання. Відповідь @ Bigbio2002 є правильною. Тут "1000000000000" - це не число, а текст, як і "adsfjhekgnoregrebgoregnkevnregj". Те, що ви говорите, є правдою, але я сильно вважаю, що це не правильна відповідь. І щоб побачити стільки результатів ...
Головний начальник

398

Ви вірні, що 32-бітове ціле число не може містити значення, більше 2 ^ 32-1. Однак значення цього 32-бітного цілого числа та те, як воно відображається на екрані, - це дві абсолютно різні речі. Друкований рядок "1000000000000" не представлений 32-бітним цілим числом в пам'яті.

Для буквального відображення числа "1000000000000" потрібно 13 байт пам'яті. Кожен окремий байт може містити значення до 255. Жоден з них не може містити цілого чисельного значення, але інтерпретуватися окремо як символи ASCII (наприклад, символ ' 0' представлений десятковою величиною 48, двійкове значення 00110000), вони можуть бути об'єднаними у формат, який має сенс для вас, людини.


Пов'язана концепція в програмуванні - це набір тексту , тобто комп'ютер інтерпретує певний потік 0s та 1s. Як і у наведеному вище прикладі, це можна інтерпретувати як числове значення, символ чи навіть щось інше цілком. У той час як 32-бітове ціле число може не утримувати значення 1000000000000, 32-бітове число з плаваючою комою зможе, використовуючи зовсім іншу інтерпретацію.

Що стосується того, як комп'ютери можуть працювати і обробляти велику кількість внутрішньо, існує 64-бітові цілі числа (які можуть вмістити значення до 16-мільярдних мільярдів), значення з плаваючою комою, а також спеціалізовані бібліотеки, які можуть працювати з довільно великими числа.


22
Насправді це здебільшого правильно, але не зовсім. 32-кратне число з плаваючою точкою навряд чи зможе точно представити 1000000000000. Він буде представляти число, дуже близьке до потрібного числа, але не саме воно.
Тім Б

6
@TimB: Ви чули про формат decimal32? Це частина стандарту IEEE 754-2008 Цей формат здатний коректно представити цей номер :)
VX

15
Щоправда, це може. Однак це не той формат, який люди мають на увазі, коли вони говорять "плаваючий", який зазвичай посилається на 32-бітовий номер з плаваючою комою, який зберігається і використовується стандартними процесорами з плаваючою комою в сучасних комп'ютерах.
Тім Б

2
@TimB дійсно. Найближче число до того, яке можна представити як float32, - 999999995904
greggo

4
@TimB: Але 64-бітове число з плаваючою комою може легко зобразити 1000000000000точно. Це 10 ^ 12, або 2 ^ 12 * 5 ^ 12; 5 ^ 12 вимагає 28 біт мантіси.
Кіт Томпсон

191

По-перше, 32-розрядні комп'ютери можуть зберігати номери до 2 ³ -1 в одному машинному слові . Машинне слово - це кількість даних, які процесор може обробити природним способом (тобто операції над даними такого розміру реалізуються апаратно і, як правило, найшвидші для виконання). 32-бітні процесори використовують слова, що складаються з 32 біт, таким чином вони можуть зберігати числа від 0 до 2³²-1 одним словом .

По-друге, 1 трлн і 1000000000000 - це дві різні речі.

  • 1 трлн - це абстрактне поняття числа
  • 1000000000000 - це текст

Натискаючи 1один раз, а потім 012 разів ви набираєте текст. 1входи 1, 0входи 0. Побачити? Ви набираєте символів. Символи - це не цифри. У машинок взагалі не було ні процесора, ні пам’яті, і вони дуже добре обробляли такі «цифри», адже це просто текст.

Доказ того, що 1000000000000 - це не число, а текст: це може означати 1 трлн (у десятковій), 4096 (у двійковій) або 281474976710656 (у шістнадцятковій). Він має ще більше значення в різних системах. Значення 1000000000000 - це число, а зберігання - це інша історія (ми повернемось до неї за мить).

Для зберігання тексту (у програмуванні його називають рядком ) 1000000000000 вам потрібно 14 байт (по одному на кожен символ плюс закінчується байт NULL, що в основному означає "рядок закінчується тут"). Це 4 машинні слова. 3 і половини вистачило б, але, як я вже сказав, операції над машинними словами найшвидші. Припустимо, ASCII використовується для зберігання тексту, тому в пам'яті він буде виглядати приблизно так: (перетворення ASCII-кодів, що відповідають 0і 1в двійкові, кожне слово в окремому рядку)

00110001 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00000000 00000000 00000000

Чотири символи вміщуються в одне слово, решта переноситься на наступне. Решта переходить до наступного слова, поки все (включаючи перший байт NULL) не відповідає.

Тепер повернемося до зберігання номерів. Це працює так само, як із текстом, що переповнюється, але вони підходять справа наліво. Це може здатися складним, тому ось приклад. Для простоти припустимо, що:

  • наш уявний комп’ютер використовує десятковий, а не двійковий
  • один байт може містити числа 0..9
  • одне слово складається з двох байтів

Ось порожня 2-словна пам’ять:

0 0
0 0

Збережемо число 4:

0 4
0 0

Тепер додамо 9:

1 3
0 0

Зауважте, що обидва операнди помістилися б в один байт, але не результат. Але у нас є ще одна готова до використання. Тепер збережемо 99:

9 9
0 0

Знову ж таки, ми використовували другий байт для зберігання числа. Додамо 1:

0 0
0 0

Уопс ... Це називається цілим переповненням і є причиною багатьох серйозних проблем, іноді дуже дорогих .

Але якщо ми очікуємо, що перелив відбудеться, ми можемо зробити це:

0 0
9 9

А тепер додайте 1:

0 1
0 0

Це стане зрозумілішим, якщо ви видалите пробіли, що розділяють байт та нові рядки:

0099    | +1
0100

Ми передбачили, що може відбутися переповнення, і нам може знадобитися додаткова пам'ять. Цей спосіб обробки чисел не такий швидкий, як з числами, що містяться в одних словах, і це має бути реалізовано в програмному забезпеченні. Додавання підтримки для двох-32-розрядних чисел слів до 32-розрядного процесора ефективно робить його 64-бітним процесором (тепер він може працювати на 64-бітних номерах, як ні?).

Все, що я описав вище, стосується і двійкової пам’яті з 8-бітовими байтами та 4-байтовими словами, це працює майже так само:

00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111    | +1
00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000

Перетворення таких чисел у десяткову систему є складним, однак. (але це дуже добре працює з шістнадцятковим )


21
Ваша відповідь читається досить поблажливо. OP явно йдеться про кількість, а не текст: large as the number 1 trillion (1000000000000). Крім того, ви майже говорите про арифметику з довільною точністю , але ви ніколи не згадуєте жодного з термінів того, що ви говорите ....
MirroredFate

12
"1 трильйон" - це також рядок
Ельзо Валугі

3
@ElzoValugi Це так. Мені довелося знайти якийсь спосіб представити поняття абстрактного числа, на відміну від рядка, що представляє число. Я вважаю, що "1 трлн" - це кращий і менш неоднозначний спосіб зробити це (див. Доказ у відповідь).
gronostaj

25
@MirroredFate Я не погоджуюся з "явно кажу про число". OP каже : «відображається нормально», в якому чітко буде говорити про текст «1000000000000» до мене ...
Джо

4
@yannbane 'A' - це символ, а не число. '?' це символ, а не число. '1' - це символ, а не число. Символи - це просто символи. Вони можуть представляти цифри чи цифри, але, безумовно, це не числа. "1" може означати одну, десять, сто, тисячу і так далі, це просто символ, який означає цифру, яка може бути числом або його частиною. '10' (рядок символів) може означати два чи вісім, десять чи шістнадцять тощо, але коли ви говорите, що у вас є десять яблук, ви використовуєте цифру десять, і всі знають, що ви маєте на увазі. Існує величезна різниця між символами та цифрами.
gronostaj

40

Ви також можете написати "ЦЕ ЗАЯВЛЕННЯ НЕПРАВИЛЬНО", без того, щоб ваш комп'ютер вийшов з ладу :) @ Відповідь Скотта є точковою для певних рамок обчислення, але ваше питання про "написання" великої кількості означає, що це просто звичайний текст, принаймні до це інтерпретується

Редагувати: тепер при меншій кількості сарказму більше корисної інформації про різні способи збереження числа в пам'яті. Я опишу це з більш високою абстракцією, тобто з точки зору того, що сучасний програміст може писати код, перш ніж його перевести в машинний код для виконання.

Дані на комп'ютері повинні бути обмежені певним типом , а комп'ютерне визначення такого типу описує, які операції можна виконати над цими даними та як (тобто порівняти числа, об'єднати текст або XOR булевим). Ви не можете просто додати текст до числа, як і ви не можете перемножувати число на текст, так що деякі з цих значень можуть бути перетворені між типами.

Почнемо з непідписаних цілих чисел . У цих типах значень всі біти використовуються для зберігання інформації про цифри; Ваш приклад з 32-розрядної цілого числа без знака , де будь-яке значення від 0до 2^32-1може бути збережені. І так, залежно від мови чи архітектури використовуваної платформи ви могли мати 16-бітні цілі чи 256-бітні цілі числа.

Що робити, якщо ви хочете отримати негатив? Інтуїтивно, підписані цілі числа - це назва гри. Конвенція виділити все значення від -2^(n-1)до 2^(n-1)-1- таким чином , ми уникнути плутанини, щоб мати справу з двома способами , щоб написати +0і -0. Таким чином, 32-розрядний ціле число буде містити значення від -2147483648до 2147483647. Акуратно, чи не так?

Гаразд, ми покрили цілі числа, які є числами без десяткової складової. Висловити це складніше: неціла частина може бути розумно лише десь між 0і 1, тому кожен додатковий біт, який використовується для його опису, збільшить його точність: 1/2, 1/4, 1/8 ... Проблема полягає в тому, що ти не може точно виразити простий десятковий 0.1як суму дробів, які можуть мати лише два значення у своєму знаменнику! Чи не було б набагато простіше зберігати число як ціле число, але погодьтесь замість цього поставити радіальну (десяткову) точку? Це називається цифрами з фіксованою точкою , де ми зберігаємо, 1234100але домовляємось про конвенцію, щоб читати її як 1234.100натомість.

Порівняно більш поширений тип, який використовується для розрахунків floating point. Те, як це працює, дійсно акуратний, він використовує один біт для зберігання знакових знаків, а потім деякий для зберігання експонента та significand. Існують стандарти, які визначають такі виділення, але для 32-розрядного плаваючого числа максимальна кількість, яку ви могли б зберігати, - переважна

(2 - 2^-23) * 2^(2^7 - 1) ≈ 3.4 * 10^38

Однак це ціною точності. JavaScript, доступний у веб-переглядачах, використовує 64-бітні поплавці, і він все ще не може виправити речі Просто скопіюйте це в адресний рядок і натисніть клавішу Enter. Попередження спойлера: результату не буде 0.3.

javascript:alert(0.1+0.2);

Є більше альтернативних типів, таких як Microsoft .NET 4.5's BigInteger, який теоретично не має верхньої та нижньої меж і повинен обчислюватися "партіями"; але, можливо, більш захоплюючими є технології, які розуміють математику, як двигун Wolfram Mathematica, який може точно працювати з абстрактними значеннями, як нескінченність .


8
Це можна зробити в цій реальності. Спробуйте це зробити у Всесвіті Star Trek. Просто встаньте раніше, через всі іскри і диму.
Майкл Петротта

Це не зовсім так, як працює фіксована точка. Це насправді система, де числа масштабуються та упереджуються для отримання десяткової крапки. У вашому прикладі шкала становить 1/1000, але є і цифри з фіксованою точкою (особливо в комп'ютерній графіці), такі: 0 = 0,0, 255 = 1,0 - шкала становить 1/255.
Андон М. Коулман

31

Ключовим моментом є розуміння того, як комп'ютери кодують числа.

Щоправда, якщо комп'ютер наполягає на збереженні чисел, використовуючи просте двійкове представлення числа за допомогою одного слова (4 байти в 32-бітовій системі), то 32-розрядний комп'ютер може зберігати числа лише до 2 ^ 32. Але існує багато інших способів кодування чисел залежно від того, що саме ви хочете досягти за допомогою них.

Один із прикладів - комп’ютери зберігають номери з плаваючою комою. Комп'ютери можуть використовувати цілу купу різних способів їх кодування. Стандарт IEEE 754 визначає правила для кодування чисел, що перевищують 2 ^ 32. Грубо, комп'ютери можуть реалізувати це, розділивши 32 біти на різні частини, що представляють деякі цифри числа та інші біти, що представляють розмір числа (тобто показник, 10 ^ х). Це дозволяє значно більший діапазончисел у розмірі, але компрометує точність (що для багатьох цілей нормально). Звичайно, комп'ютер також може використовувати для цього кодування більше одного слова, збільшуючи точність величини наявних закодованих чисел. Проста десяткова версія 32 стандарту IEEE дозволяє цифри з приблизно 7 десятковими цифрами точності та числами приблизно до 10 ^ 96 за величиною.

Але є багато інших варіантів, якщо вам потрібна додаткова точність. Очевидно, що ви можете використовувати більше слів у кодуванні без обмежень (хоча зі штрафною ефективністю для перетворення в закодований формат і з нього). Якщо ви хочете вивчити один із способів, що це можна зробити, існує велика надбудова з відкритим кодом для Excel, яка використовує схему кодування, що дозволяє сотням цифр точності в обчисленні. Додаток називається Xnumbers і доступний тут . Код знаходиться в Visual Basic, що не найшвидше, але має перевагу в тому, що його легко зрозуміти та змінити. Це прекрасний спосіб дізнатися, як комп’ютери досягають кодування довших чисел. І ви можете пограти з результатами в Excel, не встановлюючи жодних інструментів програмування.


24

Це все у вашому питанні.

Ви можете написати будь-яке вподобане вам число на папері. Спробуйте написати трильйон крапок на білому аркуші паперу. Це повільно і неефективно. Ось чому у нас є 10-цифрова система для представлення цих великих чисел. У нас навіть є назви для великих чисел, таких як "мільйон", "трильйон" і більше, тому ви цього не говорите one one one one one one one one one one one...вголос.

32-бітні процесори розроблені для роботи найбільш швидко та ефективно з блоками пам'яті, довжиною яких рівно 32 двійкові цифри. Але ми, люди, зазвичай використовуємо 10-значну числову систему, а комп'ютери, будучи електронними, використовуємо двоцифрову систему ( двійкову ). Числа 32 і 64 просто мають сили 2. Так само мільйон і трильйон - це потужність 10. Нам легше оперувати цими числами, ніж, наприклад, 65536.

Ми розбиваємо великі числа на цифри, коли пишемо їх на папері. Комп'ютери розбивають числа на більшу кількість цифр. Ми можемо записати будь-яке число, яке нам подобається, і те, що можемо зробити комп'ютери, якщо ми їх так створимо.


15

32-бітні та 64-бітні стосуються адрес пам'яті. Пам'ять комп'ютера подібна до поштових скриньок, кожна з них має іншу адресу. ЦП (центральний процесорний блок) використовує ці адреси для адреси місць пам’яті у вашій ОЗУ (оперативної пам'яті) Коли процесор міг обробляти лише 16-бітові адреси, ви могли використовувати лише 32 Мб оперативної пам’яті (що здавалося величезним на той час). З 32-бітним він перейшов до 4 + gb (що здавалося величезним на той час). Тепер, коли у нас є 64-бітові адреси, оперативна пам'ять переходить в терабайти (що здається величезним).
Однак програма здатна виділити кілька блоків пам’яті для таких речей, як зберігання чисел та тексту, тобто відповідно до програми та не пов’язаних із розміром кожної адреси. Тож програма може сказати процесору, я збираюся використовувати 10 адресних блоків пам’яті, а потім зберігаю дуже велику кількість, або рядок з 10 літер чи що завгодно.
Бічна примітка: на адреси пам'яті вказують "покажчики", тому значення 32- і 64-бітового значення означає розмір вказівника, який використовується для доступу до пам'яті.


2
Хороша відповідь, за винятком деталей - 16 біт адресного простору дав вам 64 кбіт, а не 32 Мб, а машини типу 286 мали 24-бітні адреси (для 16 Мб). Крім того, із 64-бітовими адресами ви виходите далеко за рамки терабайт - більше, ніж 16 екзабайтів - терабайт знаходиться приблизно в межах обмежень, які накладають материнські плати / процесори сучасного покоління - а не розмір адрес.
Філ

4
32-бітний стосується розміру машинного слова, а не адреси пам'яті. Як згадував Філ, 286 був 16-бітним процесором, але використовував 24 біти для адреси через сегментацію пам'яті. Процесори x86 є 32-бітними, але використовують 36-бітну адресацію. Дивіться PAE .
gronostaj

@gronostaj добре x86 мають 32-бітну адресацію від 386 до Pentium.
Руслан

Оновлення, тому що це єдина ПРАВИЛЬНА відповідь тут - 32-бітний стосується 32-бітової адреси пам'яті, а не 32-бітової арифметики.
користувач1207217

@ user1207217: ?? Отже, згідно з вашими міркуваннями, наприклад, Z80 або 8080 - це 16-бітні процесори (через 16-бітну пам'ять і шину пам'яті)?
пабук

13

Оскільки відображення числа відбувається за допомогою окремих символів, а не цілих чисел. Кожна цифра в цифрі представлена ​​окремим символом буквалом, ціле значення якого визначається кодуванням, яке використовується, наприклад 'a', представлене зі значенням ascii 97, в той час '1'як зображено символом 49. Перевірте таблицю ascii тут .
Для відображення і "a", і "1" те саме. Вони букви символів, а не цілі числа. Кожному буквеному символу дозволено мати максимальне значення 255 в 32-розрядної платформі, що зберігає значення в 8-бітовому або 1-байтному розмірі (це залежить від платформи, проте 8 біт є найбільш поширеним розміром символів), таким чином вони можуть бути згруповані разом і можуть бути відображається. Скільки окремих символів вони можуть відображати, залежить від оперативної пам’яті. Якщо у вас всього 1 байт оперативної пам’яті, ви можете відображати лише один символ, якщо у вас є 1 Гб оперативної пам’яті, ви можете добре відображати 1024 * 1024 * 1024 символів (занадто ледаче робити математику).

Однак це обмеження стосується розрахунків, однак, мабуть, вас цікавить стандарт IPV4. Хоча це не зовсім пов'язано з комп'ютерамиbit-size, це якось вплинуло на стандарти. Коли створений стандарт IPV4, вони зберігали значення ip у 32-бітових цілих числах. Тепер колись ви дали розмір, і він став стандартним. Все, що ми знаємо про Інтернет, залежало від цього, і тоді нам не вистачало IP-адрес для призначення. Тож якщо стандарт IP був переглянений на 64-бітне, все просто перестане працювати, включаючи ваш маршрутизатор (я вважаю це правильним) та інші мережеві пристрої. Отже, слід створити новий стандарт, який просто замінив 32-бітове ціле число на 128 бітове. І відрегульовано решту стандарту. Виробнику обладнання просто потрібно заявити, що вони підтримують цей новий стандарт, і він отримає вірусний характер. Хоча це не так просто, але я думаю, ви тут зрозуміли.

Відмова: Більшість моментів, згаданих тут, вірні моєму припущенню. Я, можливо, пропустив тут важливі моменти, щоб зробити це простіше. Я не добре в цифрах, тому, мабуть, пропустив деякі цифри, але моя суть тут - відповісти на відповідь ОП про те, чому це не вийде з ладу на ПК.


2
Я не звернувся до уваги, але з вашою відповіддю є ряд проблем. 1становить 0x31 в ASCII, а не 0x1. 1 ГБ = 1024 ^ 3 В. IPv4 вад, винайдений до введення 32-розрядних процесорів, так що мовлення, що адреси зберігаються в 32-бітових цілих числах, суперечить питанню ОП. І нарешті IPv6 використовує 128-бітні адреси, а не 64-бітні.
gronostaj

13

У процесорах є "слова". Є різні слова. Коли люди кажуть "32-бітний процесор", вони мають на увазі переважно "ширину шини пам'яті". Це слово складається з різних "полів", які посилаються на підсистеми комп'ютера, відповідні передачі (24 біта) та контролю (інші біти). Я можу помилятися в точних цифрах, переконайтесь у цьому за допомогою посібників.

Зовсім інший аспект - обчислення. Набори інструкцій SSE та MMX можуть зберігати довгі цілі числа. Максимальна довжина без втрати продуктивності залежить від поточної версії SSE, але її завжди дорівнює 64 біт.

Поточні процесори Opteron можуть працювати з 256-ти бітовими номерами (я не впевнений у цілому, але float - це точно).

Підсумок : (1) ширина шини не пов'язана безпосередньо з обчислювальною шириною, (2) навіть різні слова (слово пам'яті, слово регістра, слово шини тощо) не з'єднуються між собою, інакше вони мають спільний дільник приблизно 8 або 16 або 24. Багато процесорів навіть використовували 6-бітове слово (але його історію).


Неправда, оригінальний процесор Pentium мав 64-бітну шину даних для високої пропускної здатності пам’яті, навіть якщо це 32-бітний процесор. 8088 був 16-розрядним процесором з 8-бітною шиною даних.
doug65536

10

Метою обчислювального пристрою, як правило, є прийняття, обробка, зберігання та випромінення даних. Основне обладнання - це лише машина, яка допомагає виконувати ці чотири функції. Без програмного забезпечення це не може зробити ніхто.

Програмне забезпечення - це код, який повідомляє машині, як приймати дані, як обробляти їх, як зберігати їх та як надавати їх іншим.

Основне обладнання завжди матиме обмеження. У випадку 32-бітної машини більшість регістрів, які обробляють дані, мають ширину лише 32 біти. Це, однак, не означає, що машина не може обробляти числа, що перевищують 2 ^ 32, це означає, що якщо ви хочете мати справу з більшими числами, це може знадобитися машині більше одного циклу, щоб прийняти її, обробити її, зберігати це або випромінювати його.

Програмне забезпечення повідомляє апарату, як обробляти числа. Якщо програмне забезпечення призначене для обробки великої кількості, воно надсилає до процесора низку інструкцій, які розповідають, як обробляти великі номери. Наприклад, ваш номер може бути представлений двома 32-бітовими регістрами. Якщо ви хочете додати 1,234 до свого номера, програмне забезпечення скаже процесору спочатку додати 1,234 до нижнього регістра, а потім перевірте біт переповнення, щоб побачити, чи призвело це додавання до занадто великого числа для нижнього регістра. Якщо так, то він додає 1 до верхнього регістра.

Так само, як початкових школярів навчають додавати з собою, процесору можна сказати обробляти числа, більші, ніж він може містити в одному реєстрі. Це справедливо для більшості загальних математичних операцій, для чисел будь-якого практичного розміру.


10

Різниця полягає в тому, як ми зберігаємо дані в комп’ютерах.

Ви вірні, що для теоретичної 8-бітної машини ми можемо зберігати 2 ^ 8 значень лише в одному регістрі процесора або в пам'яті адреси. (Будь ласка, майте на увазі, що це варіюється від "машини" до "машини" на основі використовуваного процесора, архітектури пам'яті тощо. Але поки що давайте дотримуватимемося гіпотетичної машини "стереотип".)

Для теоретичної 16-розрядної машини максимальне значення в місці реєстрації / пам'яті складе 2 ^ 16, для 32-бітної машини 2 ^ 32 і т.д.

Протягом багатьох років програмісти розробляли всі види шикарних виробів, щоб зберігати та обробляти числа, більші, ніж їх можна зберігати в одному регістрі процесора або в пам'яті. Існує багато методів, але всі вони передбачають використання більш ніж однієї адреси регістра / пам'яті для зберігання значень, більших за їх "рідний" регістр / ширину пам'яті.

Усі ці методи вигідні тим, що машина може зберігати / обробляти значення, більші за їх власну потужність. Мінус майже у всіх підходах вимагає декількох інструкцій на машині / читання / тощо. обробляти ці числа. Для випадкової великої кількості це не проблема. У роботі з великою кількістю великої кількості (зокрема, великої адреси пам'яті) накладні накладні витрати сповільнюють роботу.

Звідси загальне прагнення зробити регістри, місця пам’яті та апаратне забезпечення пам’яті «ширшими» та ширшими, щоб обробляти великі числа «спочатку», щоб такі числа можна обробляти з мінімальною кількістю операцій.

Оскільки розмір чисельності нескінченний, регістр процесора / розмір пам’яті / адресація завжди є залишком основного розміру чисельності та витрат, пов'язаних із впровадженням більшої та більшої ширини.


8

32-бітні комп’ютери можуть зберігати номери до 2 ^ 32 в одному машинному слові, але це не означає, що вони не можуть обробляти більші об'єкти даних.

Смисл 32-бітного комп'ютера загалом полягає в тому, що шина даних і шина адреси шириною 32 біти, це означає, що комп'ютер може обробляти 4 ГБ пам’яті адресного простору одночасно і надсилати одночасно чотири байти даних по шині даних .

Це, однак, не обмежує комп'ютер від обробки більшої кількості даних, він просто повинен розділити дані на чотири байтові фрагменти, коли він надсилається через шину даних.

Звичайний 32-розрядний процесор Intel може обробляти 128-бітні номери всередині, що дозволить вам без проблем обробляти такі цифри, як 100000000000000000000000000000000000000.

Ви можете обробляти набагато більші числа, ніж на комп’ютері, але тоді обчислення повинні бути виконані програмним забезпеченням, центральний процесор не має інструкцій по роботі з номерами, що перевищують 128 біт. (Він може обробляти набагато більшу кількість у вигляді чисел з плаваючою комою, але тоді у вас є лише 15 цифр точності.)


6

Просто додайте примітку до багатьох інших відповідей, тому що це досить важливий факт у цьому питанні, який був пропущений.

"32 біт" відноситься до ширини адреси пам'яті. Це не має нічого спільного з розміром регістра. Багато 32-бітних процесорів, ймовірно, мають 64 або навіть 128 бітні регістри. Зокрема, стосовно продуктової лінійки x86, останні споживчі процесори, які мають усі 64 біти, мають до 256 бітових регістрів для спеціальних цілей.

Ця різниця між шириною регістра та шириною адреси існувала з давніх часів, коли у нас було 4 бітні регістри та 8 бітові адреси, або навпаки.

Неважко помітити, що зберігання великої кількості не є проблемою незалежно від розміру регістра, як пояснено в інших відповідях.

Причиною, чому регістри, незалежно від того, який розмір вони можуть статися, можуть також розраховуватись із більшими числами, полягає в тому, що занадто великі обчислення можуть бути розбиті на кілька менших, які вписуються в регістри (це просто крихітний складніше в реальності).


Це насправді не так; на що посилається 64 біт, є непослідовним, але системи з шириною регістра 64 біта часто називають 64 бітними. У Вікіпедії сказано, що "64-розрядна архітектура комп'ютера зазвичай має цілі регістри та адреси, що мають ширину 64 біт". Так, сучасна лінійка продуктів x86 (або AMD-64) має величезні регістри спеціального призначення, але вони мають 64-бітні основні регістри і можуть отримати доступ до 48-52 біт пам'яті; старіші системи x86 мають 32-бітні основні регістри та доступ до 24-36 бітів пам'яті, а 8086 називався 16-бітовим чіпом, мав 16-бітні регістри та мав доступ до 20 біт пам'яті.
профілі

@prosfilaes Це дуже багато цінної інформації, я мав на увазі ці (я не міг запам'ятати деталі так само, як ви зробили тхо). Не соромтесь відредагувати це у відповідь.
мафу

6

Надані відповіді насправді досить хороші, але вони, як правило, вирішують питання з різних сторін і таким чином представляють неповну картину. На мій погляд вони теж трохи надмірно технічні.

Отже, лише для уточнення того, на що натякає, але не є явно вираженим в жодних інших відповідях, і що, на мою думку, є суть справи:

Ви змішуєте декілька понять у своєму запитанні , і одне з них ("32 біт") насправді може посилатися на безліч різних речей (і різні відповіді передбачають різні інтерпретації). Всі ці поняття мають щось спільне з кількістю бітів (1 і 0), використаних (або доступних) у різних обчислювальних контекстах (що я маю на увазі під цим, я сподіваюся, буде роз'яснено на прикладах нижче), але поняття інакше не пов'язані між собою .

Явно:

  • "IPv4 / 6" відноситься до Інтернет-протоколу , набору правил, що визначають спосіб упаковки та інтерпретації інформації в Інтернеті. Основне (або, принаймні, найбільш відоме) відмінність між IPv4 та IPv6 полягає в тому, що адресний простір (тобто набір адрес, які можна використовувати для розрізнення різних місць у мережі), є більшим у IPv6. Це пов’язано з тим, скільки бітів у кожному пакеті даних, що надсилаються по мережі, виділяються (тобто відкладаються з метою) ідентифікації відправника пакета та призначеного одержувача.
    • Не обчислювальна аналогія: кожен пакет - це як лист, надісланий електронною поштою, а адресний простір - це кількість символів, яку ви "дозволено" використовувати під час написання адреси та адреси повернення на конверті.
    • Я не бачу цього згадування в жодній з інших відповідей поки що.
  • "Слова" комп'ютерної пам'яті (32-розрядні та 64-розрядні), як правило, можна розглядати як найменший фрагмент даних, який використовує комп'ютер, або "думає". Ці біти даних збираються разом, щоб скласти інші біти даних , наприклад, фрагменти тексту або більші цілі числа.
  • 32-бітні покажчики можуть бути або не бути словами, але вони все-таки розглядаються атомно (тобто як окремі одиниці, які не можуть бути розбиті на більш дрібні компоненти). Покажчики - це найнижчий рівень, за допомогою якого комп'ютер може записувати розташування в пам'яті деякого довільного фрагмента даних. Зауважте, що розмір вказівника, який використовується комп’ютером (або, дійсно, операційною системою), обмежує діапазон пам'яті, до якого можна отримати доступ одним вказівником, оскільки існує лише стільки можливих місць пам'яті, на які вказівник може "вказувати" оскільки можливі значення для самого вказівника. Це аналогічно тому, як IPv4 обмежує діапазон можливих інтернет - адрес, але робить НЕобмежте кількість даних, які можуть бути присутніми, наприклад, на певній веб-сторінці. Однак розмір вказівника не обмежує розмір самих даних, на які вказівник може вказувати. (Для прикладу схеми, що дозволяє розміру даних перевищувати діапазон покажчиків, перевірте структуру вказівника inode Linux . Зауважте, що це слово "покажчик" дещо інше, ніж типово, оскільки вказівник зазвичай посилається на покажчик у пам'ять з випадковим доступом, а не місце на жорсткому диску.)
    • Не обчислювальна аналогія: хмммм .... це трохи хитро. Можливо, десяткова система Деві для індексації бібліотечних матеріалів дещо схожа? Або будь-яка система індексації, насправді.
    • Дивіться відповідь SiteNook .
    • Зауважте, що моє пояснення вказівників вище висвітлює деякі тонкі деталі і, мабуть, не зовсім коректно. Однак у мовах програмування, в яких програмісти працюють безпосередньо з покажчиками, ментальний режим, який я намалював, як правило, достатній для практичних цілей.
  • У числі , що комп'ютер «може відображати» немає (для практичних цілей) , обмежених апаратних засобів або операційною системою комп'ютера; вони трактуються, як і будь-який інший текст.

Зауважте, що це не призначений для вичерпного переліку тлумачень фрази "32 біт".

Додатковий кредит: щоб дійсно побачити філософські розрізнення між голими кістками між цифрами та примітивними фрагментами комп'ютерної пам'яті, прочитайте трохи про машини Тьюрінга .


Я думаю, що посилання на IPv4 полягало в тому, що кількість адрес IPv4 фактично обмежена довжиною підписаного 32-бітного цілого числа, тоді як IPv6 використовує 128 біт і тому може мати на багато порядків більше адрес.
Клонкекс

@Clonkex Можливо, хоча це точно не питання.
Кайл Странд

5

Якщо ви запишете 1000000000000, наприклад, в калькулятор, комп'ютер обчислить його як реальне число типу з десятковою комою . Обмеження на 32 біти, про яке ви згадали, стосується всіх номерів типу Integer без десяткових знаків. Різні типи даних використовують різні способи потрапляння в біти / байти.

Числа типів цілого числа : Ця таблиця може допомогти вам зрозуміти точку ( http://msdn.microsoft.com/en-us/library/296az74e.aspx ). Це стосується меж для C ++. Наприклад, номер типу Int64 має обмеження від -9223372036854775808 до 9223372036854775807.

Реальні цифри типу : Числа реального типу містять значення з плаваючою точкою та експонентом, і ви можете вводити набагато більші числа, але з обмеженою точністю / точністю. ( http://msdn.microsoft.com/en-us/library/6bs3y5ya.aspx ) Наприклад, LDBL (великий подвійний) у C ++ має максимальний показник 308, тому, можливо, ви можете ввести чи мати в результаті число 9.999 x 10^308, значить, ви будете теоретично мають 308 (+1) цифр, 9але лише 15 найважливіших цифр будуть використані для його представлення, решта буде втрачена через обмежену точність.

Крім того, існують різні мови програмування, і вони можуть мати різну реалізацію обмежень кількості. Таким чином, ви можете уявити, що спеціалізовані програми можуть обробляти набагато більші (та / або більш точні / точні) числа, ніж C ++.


Ця "відповідь" невірна: калькулятори використовують представлення номерів BCD, щоб уникнути помилок усікання. IE 0,1 десятковий не може бути точно представлений як двійкове число кінцевої довжини.
тирса

5

У випадку, якщо вам потрібен практичний приклад того, скільки програм у типовій системі Linux обробляють обробку та вихід великої кількості:

libgmp- Бібліотека множинної точності арифметики GNU є найбільш широко використовуваною для цього бібліотекою в системах Linux. Простий приклад множення 2 ^ 80 на 1000:

#include <gmp.h>

// Each large integer uses the mpz_t type provided by libgmp
mpz_t a_large_number;
mpz_t base;
mpz_t result;

// Initalize each variable
mpz_init(a_large_number);
mpz_init(base);
mpz_init(result);

// Assign the number 2 to the variable |base|
mpz_set_ui(base, 2);

// Raise base^80 (2^80), store the result in |a_large_number|
mpz_pow_ui(a_large_number, base, 80);

// Multiply |a_large_number| by 1000, store the result in |result|
mpz_mul_ui(result, a_large_number, 1000);

// Finally, output the result in decimal and hex notation
gmp_printf("decimal: %Zd, hex: %ZX\n", result, result);

Так що в основному це те саме, що використовувати звичайні оператори + - * /, просто з бібліотекою розбивати числа і зберігати їх внутрішньо як кілька машинних розмірів (тобто 32-бітних) чисел. Існують також функції типу scanf () для обробки перетворення тексту введення в цілі типи.

Структура mpz_tточно схожа на приклад Скотта Чемберлена, який рахує до 6, використовуючи дві руки. Це в основному масив mp_limb_tтипів машинного слова розміром , і коли число занадто велике, щоб підходити до машинного слова, GMP використовує кратне mp_limb_tдля зберігання високих / низьких частин числа.


5

В голові ви знаєте лише 10 різних цифр. 0 до 9. Всередині вашого мозку це, безумовно, закодовано інакше, ніж у комп’ютері.

Комп'ютер використовує біти для кодування чисел, але це не важливо. Ось тільки так інженери вирішили кодувати речі, але ви повинні ігнорувати це. Ви можете думати про це як 32-розрядний комп'ютер, який має унікальне представлення більш ніж 4 мільярдів різних значень, тоді як у нас, людей, є унікальне представлення для 10 різних значень.

Всякий раз, коли ми повинні розуміти більшу кількість, ми використовуємо систему. Найменше ліве число - найважливіше. Це в 10 разів важливіше наступного.

Комп'ютер, здатний розмежувати чотири мільярди різних значень, аналогічно повинен буде зробити найменше значення у наборі значень у чотири мільярди разів важливіше наступного значення у цьому наборі. Насправді комп’ютер взагалі не хвилює. Він не присвоює "значення" числу. Програмісти повинні скласти спеціальний код, щоб подбати про це.

Щоразу, коли значення стає більшим за кількість унікальних символів, 9 у розумі людини, ви додаєте його до числа зліва.

3+3=6

У цьому випадку кількість все ще входить в один "слот"

5+5=10. This situation is called an overflow.

Тож люди завжди стикаються з проблемою недостатнього унікального символу. Якщо на комп’ютері немає системи для вирішення цього питання, він просто напише 0, забувши, що було додаткове число. На щастя, комп'ютери мають "прапор переповнення", який піднімають у цьому випадку.

987+321 is more difficult.

Можливо, ви вивчили метод у школі. Алгоритм. Алгоритм досить простий. Почніть з додавання двох лівих символів.

7+1=8, we now have ...8 as the result so far

Потім ви переходите до наступного слоту і виконайте те саме додавання.

8+2=10, the overflow flag is raised. We now have ...08, plus overflow.

Оскільки у нас був переповнення, це означає, що ми повинні додати 1 до наступного числа.

9+3=12, and then we add one due to overflow. ...308, and we had another overflow.

Більше не потрібно додавати цифри, тому ми просто створюємо слот і вставляємо 1, оскільки прапор переповнення був піднятий.

1308

Комп'ютер робить це точно так само, за винятком того, що він має 2 ^ 32 або навіть краще 2 ^ 64 різних символу, а не лише 10, як люди.

На апаратному рівні комп'ютер працює одинарними бітами, використовуючи абсолютно той самий метод. На щастя, це відлучено для програмістів. Біти - це лише дві цифри, тому що це легко представити в лінії електропередач. Або світло увімкнено, або вимкнено.

Нарешті, комп'ютер міг відображати будь-яке число у вигляді простої послідовності символів. Ось в чому найкраще комп’ютери. Алгоритм перетворення між послідовністю символів і внутрішнім поданням досить складний.


У моїй свідомості я знаю 36, але я, як правило, використовую лише 16 з них.
Кайл Странд

"Комп'ютер використовує біти для кодування чисел, але це не важливо." У контексті запитання користувача про 32-бітові слова та те, як вони використовуються для зберігання чисел, більших від 2 ^ 32-1, дуже важливо.
HörmannHH

Не важливо, як ви кодуєте числа в пам'яті свого мозку. У вас є обмежена кількість уявлень; більшість вивчили 10 різних символів. Всередині вашого мозку це, мабуть, представлено у вигляді тисяч нейронів та синапсів. У комп’ютері він представлений у вигляді електроенергії або без електроенергії на електромережі. З точки зору програмування - або при вивченні математики це зовсім не важливо, за винятком випадків, коли ви програмуєте безпосередньо для певного набору процесорів. Він запитує про 32 біт проти 64 біт, а не про окремі біти.
frodeborli

3

Тому що ви не відображаєте число (що стосується комп'ютера), а рядок або послідовність цифр. Звичайно, деякі програми (наприклад, калькулятор, я думаю), які мають справу з числами, можуть обробляти таке число, я думаю. Я не знаю, які хитрощі вони використовують ... Я впевнений, що деякі інші, більш досконалі відповіді висвітлюють це.


0

Більша частина змісту цієї відповіді спочатку походила з цієї відповіді (написана до цього іншого питання була позначена як дублікат). Тож я обговорюю використання 8-бітових значень (хоча це питання задавало 32-бітні значення), але це нормально, оскільки 8-бітні значення простіше зрозуміти концептуально, і ті ж самі поняття застосовуються до великих значень, таких як 32-бітна арифметика.

Коли ви додасте два числа, які є 8 бітними, найбільше число ви можете отримати (0xFF + 0xFF = 1FE). Насправді, якщо ви помножите два числа, які є 8-бітними, то найбільше число, яке ви можете отримати (0xFF * 0xFF = 0xFE01), це все-таки 16 біт, вдвічі більше 8-розрядних.

Тепер ви можете припускати, що x-бітовий процесор може відслідковувати лише x-біти. (Наприклад, 8-бітний процесор може відслідковувати лише 8 біт.) Це не точно. 8-бітний процесор отримує дані 8-бітними фрагментами. (Ці "шматки" зазвичай мають формальний термін: "слово". На 8-бітовому процесорі використовуються 8-бітні слова. На 64-бітному процесорі можна використовувати 64-бітні слова.)

Отже, коли ви надаєте комп'ютеру 3 байти:
Байт №1:
Байт інструкції MUL №2: байти високого порядку (наприклад, 0xA5)
Байт №3: байти нижнього порядку (наприклад, 0xCB)
Комп'ютер може генерувати результат, який більше 8 біт. Процесор може генерувати такі результати:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Тепер дозвольте мені інтерпретувати, що для вас:
0x означає, що наступні цифри є шістнадцятковими.
Я коротко детально обговорю "40".
82 є частиною регістра "А", який представляє собою серію з 8 біт.
xx і xx є частиною двох інших регістрів, названих регістром "B" та регістром "C". Причиною того, що я не заповнив ці біти нулями або одиницями, є те, що вказівка ​​"ADD" (надіслана до процесора) може призвести до того, що ці біти не змінюються інструкцією (тоді як більшість інших бітів, які я використовую в цьому прикладі, можуть змінити, за винятком деяких бітів прапора).
D7 помістився б у декількох бітах, названих регістром "D".
Реєстр - просто частинка пам'яті. Реєстри вбудовані в процесори, тому процесор може отримати доступ до регістрів, не потребуючи взаємодії з пам'яттю на RAM-накопичувачі.

Тож математичний результат 0xA5 разів 0xCB дорівнює 0x82D7.

Тепер, чому біти розбилися на регістри A і D замість регістрів A і B, або регістри C і D? Ну, ще раз, це зразковий сценарій, який я використовую, мав бути досить схожим за концепцією на реальній мові збірки (Intel x86 16-розрядний, як це використовуються Intel 8080 та 8088 та багато новіших процесорів). Можливо, існують деякі загальні правила, такі як регістр "C", який зазвичай використовується як індекс для підрахунку операцій (типовий для циклів), а регістр "B" використовується для відстеження зрушень, які допомагають визначити місця пам'яті. Отже, "A" і "D" можуть бути більш поширеними для деяких загальних арифметичних функцій.

Кожна інструкція щодо процесора повинна мати певну документацію, яку використовують люди, які програмують в Асамблеї. Ця документація повинна визначати, які регістри використовуються кожною інструкцією. (Отже, вибір щодо того, які регістри використовувати, часто визначають дизайнери ЦП, а не програмісти мови Асамблеї. Хоча, може бути певна гнучкість.)

Тепер, повертаючись до "40" у наведеному вище прикладі: це серія бітів, яку часто називають "регістром прапорів". Кожен біт у реєстрі прапорів має назву. Наприклад, є біт "переповнення", який CPU може встановити, якщо отриманий результат більший за простір, який може зберігати один байт результатів. (Біт "переповнення" часто може називатися скороченою назвою "OF". Це велика літера, а не нуль.) Програмне забезпечення може перевірити значення цього прапора і помітити "проблему". Робота з цим бітом часто непомітно обробляється мовами вищого рівня, тому початківці програмісти часто не дізнаються про те, як взаємодіяти з прапорцями CPU. Однак програмісти по збірці можуть зазвичай отримувати доступ до деяких цих прапорів таким чином, що дуже схожий на інші змінні.

Наприклад, у вас може бути кілька інструкцій щодо додавання. Одна інструкція ADD може зберігати 16 бітів результатів в регістрі A і D-регістрі, тоді як інша інструкція може просто зберігати 8 низьких бітів в регістрі A, ігнорувати D-регістр і вказувати біт переповнення. Потім, пізніше (після збереження результатів реєстру A в основній оперативній пам’яті), ви можете використовувати іншу інструкцію ADD, яка зберігає в реєстрі лише 8 високих розрядів (можливо, регістр A). Чи потрібно вам використовувати прапор переповнення залежить лише від того, яку інструкцію щодо множення ви використовуєте.

(Існує також звичайний прапор "під", якщо ви віднімаєте занадто багато, щоб підходити до бажаного результату.)

Тільки для того, щоб показати вам, наскільки складні речі:
Intel 4004 був 4-бітним процесором
. Intel 8008 - це 8-розрядний процесор. Він мав 8-бітні регістри з назвою A, B, C та D.
Intel 8086 був 16-бітним процесором. Він мав 16-бітні регістри з назвою AX, BX, CX і DX.
Intel 80386 був 32-розрядним процесором. Він мав 32-бітні регістри з назвою EAX, EBX, ECX та EDX.
Процесори Intel x64 мають 64-бітні регістри з назвою RAX, RBX, RCX і RDX. Чіпи x64 можуть працювати з 16-бітовим кодом (у деяких режимах роботи) та можуть інтерпретувати 16-бітні інструкції. При цьому біти, що складають регістр AX, - це половина бітів, що складають регістр EAX, - це половина бітів, що складають регістр RAX. Отже, щоразу, коли ви змінюєте значення AX, ви також змінюєте EAX і RAX, тому що ті біти, які використовує AX, є частиною бітів, які використовуються RAX. (Якщо ви зміните EAX на значення, кратне 65536, то низькі 16 біт не змінюються, щоб AX не змінився. Якщо ви зміните EAX на значення, яке не є кратним 65,536, то це також вплине на AX .)

Є більше прапорів та регістрів, ніж лише ті, про які я згадав. Я просто обрав кілька часто використовуваних, щоб надати простий концептуальний приклад.

Тепер, якщо ви користуєтесь 8-бітним процесором, коли ви пишете в пам'ять, ви можете виявити деякі обмеження щодо можливості посилатися на адресу 8-бітних, а не на адресу 4-бітових або 16-бітних. Деталі залежать від ЦП, але якщо у вас є такі обмеження, то CPU може мати справу з 8-бітовими словами, саме тому CPU найчастіше називають "8-бітним процесором".


Я відчуваю, що частини моєї відповіді повторюють деякі інші відповіді на це питання. Однак цього не помітили, коли я вперше написав вміст, оскільки написав це для іншого питання. Крім того, хоча я ціную відповідь Animism, включаючи якийсь код мовою C, я відчув, що мій вміст надав деякі деталі про те, як працює збірка, що ближче до реальних дій / дизайну процесора. Тож моя відповідь не намагається бути вищою відповіддю, яка є "кращою за" всіх інших, а просто додатковою; додавши ще одну перспективу з деяким додатковим розумінням
TOOGAM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.