Чому шістнадцяткові числа мають префікс як 0x
? Я розумію використання префікса, але не розумію значення того, чому 0x
було обрано.
Чому шістнадцяткові числа мають префікс як 0x
? Я розумію використання префікса, але не розумію значення того, чому 0x
було обрано.
Відповіді:
Коротка історія:0
каже аналізатору , що має справу з постійною (а не ідентифікатор / зарезервоване слово). Для уточнення бази чисел все ще потрібно щось: x
вибір - це довільний вибір.
Довга історія: У 60-х роках переважаючі системи програмування чисел були десятковими і восьмеричними - основні рамки мали 12, 24 або 36 біт на байт, що добре ділиться на 3 = log2 (8).
Мова BCPL використовувала синтаксис 8 1234
для вісімкових чисел. Коли Кен Томпсон створив B з BCPL, він використав 0
замість цього префікс. Це чудово, тому що
0
однакова в обох базах),00005 == 05
), і#123
).Коли C було створено з B, виникла потреба у шістнадцяткових числах (PDP-11 мав 16-бітні слова), і всі пункти вище були все ще дійсними. Оскільки вісімки все ще були потрібні для інших машин, 0x
його довільно обирали ( 00
ймовірно, виключали як незручне).
C # є нащадком C, тому він успадковує синтаксис.
0x
над 00
перевагою / незграбністю. 00
порушив би існуючий код. 0010
як вісімковий 8
, а 0010
як би оксидальний 16
. Вони не могли використовувати будь-яке число як індикатор другої цифри (за винятком 8
або 9
, і не має жодного значення, пов’язаного з шістнадцятковим числом), тому літера є обов'язковою. І це залишає або 0h
або 0x
( H e X idecimal). З цього моменту, здається, це справді повертається до уподобань.
0
префікса для восьмерики протягом багатьох років спричиняло дуже багато проблем. Зокрема, у таких країнах, як Великобританія, де номери телефонів починаються з а 0
. Javascript та багато інших мов розбирали б їх як восьмеричний, маніпулюючи числом перед зберіганням. Щоб додати задоволення, один популярний продукт бази даних мовчки переключиться на десятковий синтаксичний розбір, якщо число містить 8
або 9
.
Примітка: я не знаю правильної відповіді, але нижче - це лише моя особиста міркування!
Як було зазначено, число 0 раніше число означає, що це восьмери:
04524 // octal, leading 0
Уявіть, що потрібно створити систему для позначення шістнадцяткових чисел, і зверніть увагу, що ми працюємо в середовищі стилю С. Як щодо закінчення h як збірка? На жаль, ви не можете - це дозволить вам зробити жетони, які є дійсними ідентифікаторами (наприклад, ви могли б назвати змінну тим же самим), що спричинило б деякі неприємні неоднозначності.
8000h // hex
FF00h // oops - valid identifier! Hex or a variable or type named FF00h?
Ви не можете вести з персонажем з тієї ж причини:
xFF00 // also valid identifier
Використання хеша, ймовірно, було викинуто, оскільки воно суперечить препроцесору:
#define ...
#FF00 // invalid preprocessor token?
Зрештою, з будь-якої причини вони вирішили поставити х після провідного 0 для позначення шістнадцяткової. Це однозначно, оскільки він все ще починається з символу числа, тому не може бути дійсним ідентифікатором, і, ймовірно, ґрунтується на восьмеричній умові провідного 0.
0xFF00 // definitely not an identifier!
0xFFAB1234
треба писати як 0FFAB1234h
. Я пам'ятаю його від вбудованого асемблері в Паскалі , коли я був молодим stackoverflow.com/q/11733731/995714
Це приставка, щоб вказати, що число знаходиться в шістнадцятковій, а не в якійсь іншій базі. Мова програмування C використовує його для повідомлення компілятору.
Приклад:
0x6400
перекладається 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
Коли компілятор читає 0x6400
, Він розуміє, що число є шістнадцятковим за допомогою 0x терміна. Зазвичай ми можемо зрозуміти за (6400) 16 або (6400) 8 чи іншим ..
Для двійкових це було б:
0b00000001
Сподіваюся, я якось допоміг.
Хороший день!
x6400
? Ці x
ще можна використовувати для виведення шістнадцяткової.
Попередній 0 використовується для позначення числа в базі 2, 8 або 16.
На мою думку, 0x було обрано для позначення шістнадцяткової, оскільки "x" звучить як шестнадцятковий.
Просто моя думка, але я думаю, що це має сенс.
Хороший день!