11

Что это за числа: 0x10, 0o10, 010, 0b10?

  • В какой системе счисления находится каждое число из приведённого списка?
  • Чему равняется каждое число из приведённого списка?
  • Почему та или иная буква используется для конкретного числа?
  • Какие числа / буквы можно использовать при применении литерала?

И отдельно про 1e10:

  • Какому математическому выражению равняется 1e10?
  • Где и зачем используется такая запись?
  • Что значит часть с e10?

О вопросе: "Числа, начинающиеся с нуля, в JavaScript".

Наши вопросы похожи, но мой вопрос про численные литералы в общем, а "оригинальный", про численные литералы являющиеся восьмеричными числами.

EDIT: Теперь я также добавил в запрашиваемую информацию литералы вида 1e10, так что теперь, @Grundy не сможет отмечать мой вопрос как дубликат, так ведь?

ΝNL993
  • 3,453
  • 7
    @Grundy прекратите пожалуйста. Это разные вопросы. Там про восьмеричную конкретику, тут - про более общее - форматы записи чисел. – Kromster Dec 27 '22 at 11:58
  • 7
    @Grundy ты бы хоть объяснил своё поведение, а не тихушничал – Алексей Шиманский Dec 27 '22 at 18:43

1 Answers1

15

1. 0x10

Это шестнадцатеричный литерал, он равен 16 т.к. в шестнадцатеричной системе счисления 10 = 16. Латинская буква x используется т.к. в названии есть, собственно говоря, сам x: hexadecimal. Подробнее в википедии.

Можно использовать эти буквы и цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, A, B, C, D, E, F

2. 0o10/010

Эти два литерала (0o10 и 010) буквально равны друг другу т.к. оригинальные разработчики JavaScript решили так сделать. Эти литералы используются, чтобы обозначить, то что число в восьмеричной системы счисления, и равны 8. К слову, в JavaScript если попытаться к восьмеричному литералу написать 8 или 9, то тогда JavaScript выдаст ошибку (Пример: 0o48 -> Uncaught SyntaxError: unexpected token: numeric literal). В 0o10 используется o т.к. на английском восьмеричный переводится как octal, а почему 010 сделали восьмеричной, мне не известно. Подробнее в википедии.

Можно использовать эти цифры: 0, 1, 2, 3, 4, 5, 6, 7

3. 0b10

А вот этот литерал используется в двоичной системе счисления и он равен 2. Используется b т.к. двоичный переводится как binary. Если в таком числе использовать число которое не равняется 0 или 1, то тогда JavaScript выдаст ошибку. Подробнее на википедии

Можно использовать эти цифры: 0, 1

В виде таблицы:

Число Система счисления Равняется Происхождение
0x10 Шестнадцатеричная 16 Hexadecimal
0o10/010 Восьмеричная 8 Octal
0b10 Двоичная 2 Binary

4. 1e10

Объясняя просто, 1e10 это математическое выражение которое в понятном нам виде выглядит так: 1 * (10 ^ 10) (Или так, если вы хотите записать его в JS: 1 * (10 ** 10)). Есть много видов записи такого литерала, вот некоторые из них (примеры с тысячей):

  • 1e3 = 1000
  • 1e-3 = 0.001

Часто такие литералы могут использоваться при минимизации (минификации) кода, т.к. позволяют сохранить пару байт.

В совокупности с вышесказанным, отвечаю на вопрос, e10 значит умножить на 10 возведя в 10 степень (1 * 10 ** 10)

P.S. У таких литералов буква в начале также может записываться как заглавная, на работу это никак не влияет. (Примеры: 0X10, 0O10, 0B10, 1E10)

ΝNL993
  • 3,453
  • 2
    JS, конечно, странный язык, по логике 010 скорее уж двоичным должно было бы быть ) – CrazyElf Jun 21 '22 at 06:13
  • 3
  • 2
    @CrazyElf наверное 010 восьмеричное потому что 0 напоминает букву "o", а та, в свою очередь сокращение от "octo" (ну или на инглише подобное есть "octosyllabic"), что есть восемь/восьмисложный)) – Алексей Шиманский Dec 26 '22 at 06:50
  • Если в числе первый ноль, то оно восьмеричное. Это общепринятая практика во многих языках. Кстати, на эти грабли многие наступают, когда конвертируют строки в числа. И при этом не указывают базис числа. – newman Dec 27 '22 at 12:49
  • @newman +'050' === 50, parseInt('050') === 50, Number('050') === 50, попробуйте, вроде всё равняется 50. Можете показать пример или дать ссылку на его где можно воспроизвести проблему с переводом из строки в числа? – ΝNL993 Dec 27 '22 at 13:01
  • @ΝNL993, если число начинается с 0, то оно восьмеричное, такой трактовки придерживаются многие традиционные (начиная с 70-х годов) функции языка Си (естественно, если систему счисления надо угадать) – avp Dec 27 '22 at 21:24
  • 1
    @ΝNL993, вроде всё равняется 50. Просто все уже наелись этого кактуса и сделали десятичную интерпретацию по умолчанию. Но раньше parseInt мог парсить строки, начинающиеся с нуля, как восьмеричные. См. How do I work around JavaScript's parseInt octal behavior?. Также про восьмеричный режим parseInt пока ещё можно прочесть на русской версии MDN. – wololo Dec 28 '22 at 22:50
  • про восьмеричную систему с нулём : это была всего-лишь первая попытка основать бинарные числа. но история направила на более удобное 16-ричное исчисление. И 8-ричное с нулём впереди осталось как исторический след. – AlexGlebe Jan 15 '23 at 19:41