2010-04-19 2 views
299

Почему шестнадцатеричные числа с префиксом 0x? Я понимаю использование префикса, но я не понимаю значение почему выбрано 0x.Почему шестнадцатеричные числа с префиксом 0x?

+5

Теперь я понимаю, что название и текст задают два совершенно разных вопроса. Большинство ответов сосредоточено на вопросе в названии. Ответ на вопрос в тексте просто «это ничего не значит - это просто префикс, говорящий компилятору, что целое число записано в шестнадцатеричном виде». –

+20

Чтобы быть педантичным, можно также интерпретировать вопрос в названии двумя разными способами: 1) «Почему шестнадцатеричные числа префиксны как 0x, в отличие от любого другого префикса или индикатора?» 2) «Почему нам нужно использовать префикс при вводе шестнадцатеричных чисел? Конечно, компилятор распознает 58А как шестнадцатеричное число, даже без префикса?» Ответ на вторую интерпретацию вопроса тривиален. «123» также является шестнадцатеричным числом. –

+1

Я отредактировал вопрос, чтобы отразить первую интерпретацию. А также исправить английский :) –

ответ

324

Краткая история:0 говорит анализатору он имеет дело с константой (а не с идентификатором/зарезервированным словом). Что-то еще необходимо для указания базы чисел: x - произвольный выбор.

Длинная история: В 60-х годах, преобладающие системы счисления программирования были десятичной и восьмеричной - мэйнфреймы было 12, 24 или 36 битов на байт, который является хорошо делится на 3 = log2 (8).

Язык BCPL использовал синтаксис 8 1234 для восьмеричных номеров. Когда Кен Томпсон создал B из BCPL, он вместо этого использовал префикс 0. Это здорово, потому что

  1. целая константа теперь всегда состоит из одного маркеров,
  2. анализатор все еще может сказать сразу же у него есть постоянный,
  3. анализатор может сразу сказать, основанию (0 является то же самое в обеих базах),
  4. это математически вменяемый (00005 == 05), и
  5. не драгоценные специальные символы не нужны (как в #123).

Когда C было создано из B, возникла необходимость в шестнадцатеричных числах (PDP-11 имел 16-разрядные слова), и все вышеперечисленные пункты были по-прежнему действительны.Так как восьмеричные все еще нужны для других машин, 0x был произвольно выбран (00, вероятно, был исключен как неудобный).

C# является потомком C, поэтому он наследует синтаксис.

+76

Я не думаю, что '0x' над' 00' было предпочтение/неловкость. '00' нарушит существующий код. '0010', как восьмеричный' 8', а '0010' как hexidecimal будет' 16'. Они не могли использовать любое число в качестве индикатора второй цифры (кроме '8' или' 9', и ни одно из них не имеет никакого значения, связанного с шестнадцатеричным), поэтому письмо является обязательным. И это оставляет либо '0h', либо' 0x' (** H ** e ** X ** idecimal). С этого момента кажется, что это действительно назад к предпочтению. – GManNickG

+1

Связанные: http://stackoverflow.com/questions/18987911/bcpl-octal-numerical-constants и http://stackoverflow.com/questions/11483216/why-are-leading-zeroes-used-to-represent-octal -numbers –

+15

Использование префикса '0' для восьмеричного вызвало столько проблем на протяжении многих лет. Особенно в таких странах, как Великобритания, где номера телефонов начинаются с '0'. Javascript и многие другие языки будут анализировать их как восьмеричные, искажая номер перед хранением. Чтобы добавить к забаве, один популярный продукт базы данных будет _silently_ вернуться к десятичному разбору, если число содержит '8' или' 9'. – Basic

84

Примечание: я не знаю правильного ответа, но ниже это только мои личные предположения!

Как уже упомянул 0 до того, как число означает, что это восьмеричное:

04524 // octal, leading 0 

Представьте необходимости придумать систему для обозначения шестнадцатеричных чисел, и обратите внимание, что мы работаем в среде стиле C. Как насчет окончания с h как сборка? К сожалению, вы не можете - это позволит вам делать маркеры, которые являются действительными идентификаторами (например, вы можете назвать переменную одинаково), что сделало бы для некоторых неприятных двусмысленностей.

8000h // hex 
FF00h // oops - valid identifier! Hex or a variable or type named FF00h? 

Вы не можете вести с характером по той же причине:

xFF00 // also valid identifier 

Использование хэш вероятно выброшен, потому что он конфликтует с препроцессором:

#define ... 
#FF00 // invalid preprocessor token? 

В конец, по какой-то причине, они решили поставить x после того, как ведущий 0 обозначил шестнадцатеричный. Это однозначно, так как он все еще начинается с номера символа, так не может быть допустимым идентификатором, и, вероятно, основаны от восьмеричного конвенции ведущего 0.

0xFF00 // definitely not an identifier! 
+2

Интересно. Я предполагаю, что они могли бы использовать ведущий 0 и конечный h для обозначения hex. Конец h, вероятно, был бы путать с суффиксом спецификатора типа, например. 0xFF00l vs 0FF00hl – zdan

+1

Этот аргумент подразумевает, что использование начального нуля для обозначения восьмеричных чисел предшествует использованию шестнадцатеричного префикса «0x». Это правда? –

+1

Разве они оба не были изобретены одновременно? Зачем когда-нибудь быть, а не другим? – AshleysBrain

16

SIMPLE

Это префикс, чтобы указать число в шестнадцатеричной системе, а не в каком-то другом основании. Язык программирования C использует его для компиляции.

Пример:

0x6400 переводит к 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. Когда компилятор читает 0x6400, он понимает, число шестнадцатеричный с помощью 0x перспективы. Обычно мы можем понимать (6400) или (6400) или любой другой ..

Для Binary будет

0b00000001

Надежда помогли в некотором роде.

Добрый день,

+0

Бинарные литералы поддерживаются только на C++ с C++ 14 и вообще не поддерживаются в C. – Ruslan

0

Предшествующее 0 используется для указания количества в базе 2, 8 или 16.

На мой взгляд, 0x был выбран для обозначения шестигранник, потому что звуки «х» как гексагон.

Просто мое мнение, но я думаю, что это имеет смысл.

Добрый день!

+1

Спасибо за ответ! Я понимаю, что это ваш первый пост в StackOverflow. Ответ мог бы быть более полезным, если мнения отделены от фактов. –

Смежные вопросы