Numlex Документация
Справочник синтаксиса
Сообщить о проблеме

Числа и системы счисления

Десятичные, группированные, научные и компактные литералы, быстрые операторы и точные целочисленные базы (hex, binary, octal).

Numlex принимает числа так, как их пишут люди — группировка тысяч, научная запись, компактные суффиксы вроде 1.5M — а также точные целочисленные формы 0x, 0b и 0o.

Эта страница описывает сами литеральные формы, неочевидные места с компактными суффиксами (5m — пять миллионов, а не пять метров), необязательные быстрые операторы, целочисленные базы с их правилами отображения и переполнения и полный набор примеров.

Десятичные литералы

  • Десятичный разделитель — . или , в зависимости от регионального формата — см. форматы чисел и отображение.
  • Разделители тысяч во вводе нормализуются: 1,234 → 1234, 1 234 (зависит от формата). Внутри вызовов функций запятая может вместо этого разделять аргументы — см. встроенные функции.
  • Научная запись: 1.5e6, 2E-3.
  • Пробелы вокруг операторов произвольны; скобки ( ) группируют; унарные + и - допустимы.

Компактные суффиксы

Компактные суффиксы стоят сразу после числа, без пробела, и применяются к скалярам и денежным суммам:

СуффиксМножительПримеры
k / K×10³1.5k = 1 500; $2.5k = $2 500
m / M×10⁶1.5M = 1 500 000; $2.5M = $2 500 000

Два момента, которые стоит знать:

  • 5m — это 5 000 000, а не пять метров. Метру нужен пробел: 5 m.
  • G, T и P — не скалярные и не денежные суффиксы. 1.5G вычёркивает букву G как неизвестное слово и возвращает 1.5. Гига и тера существуют только как каталожные имена единиц, используемые с пробелом: 2 Gm, 2 Gb, 2 Gbyte.

Быстрые операторы (настройка)

При включённой настройке Quick operators четыре буквы действуют как операторы только между двумя цифрами — внутри идентификаторов они не работают:

БукваОператор
p+
m−
x×
d÷

Литерал 0x… никогда не превращается в умножение.

Целочисленные базы (точные)

Radix-литералы используют строгий префикс; регистр префикса не важен (0X, 0B, 0O работают):

ПрефиксБазаЦифры
0x160-9 A-F
0b20 1
0o80-7

Правила:

  • Подчёркивания только между двумя цифрами: 0x1_0, 100_000. Двойные подчёркивания, подчёркивания по краям или сразу после префикса — ошибки (0x_1F, 0x1F_).
  • Знаково-модульная запись: -0x10 = −16. Модуль литерала ограничен 0x7FFFFFFFFFFFFFFF (9223372036854775807) в любой базе: -0x7FFFFFFFFFFFFFFF принимается, а -0x8000000000000000 и 0x8000000000000000 выходят за максимум точных целых и являются ошибками. Переполнение цифры (0x10000000000000000) — тоже ошибка.
  • Отображение: неотрицательные результаты отображаются в базе выражения (0x1F + 1 → 0x20). Отрицательные результаты и операции за пределами точных целых (деление с остатком, ^ с отрицательным показателем) отображаются в десятичной (-0x10 → −16).
  • Обычные цепочки десятичных цифр не являются точными целыми. 9223372036854775808 превращается в 9.22e18. Точные целые применяются только к литералам с базой, функциям int/bin/oct/hex и фразам as / in / to base.

Базовые имена и фразы

Базовые имена не зависят от регистра:

ИмяБаза
decimal, base1010
binary, base22
octal, base88
hex, hexadecimal, base1616
base 2 / base 8 / base 10 / base 16 (целое через пробел)2 / 8 / 10 / 16
<expr> as <base name>          255 as hex            → 0xFF
<expr> in <base name>          99 in binary          → 0b1100011
<expr> to base 8               64 to base 8          → 0o100

Побитовые операции

Режим точных целых включается литералами 0x/0b/0o, вызовами int(/bin(/oct(/hex(, фразами … as|in <base> и … to base N, а также побитовыми глифами & | << >> или словом xor (глифы считаются только когда в строке есть математическое содержимое — fish & chips остаётся прозой). Слова and/or работают как побитовые, только когда обе стороны — целые.

ОперацияСмыслПримечания
&побитовое И
|побитовое ИЛИглиф всегда побитовый: логические операнды — ошибка (false | (1/0 > 0))
xorпобитовое исключающее ИЛИ (слово)6 xor 3 = 5
<<сдвиг влевосдвиг 0…63; переполнение — ошибка
>>сдвиг вправосдвиг 0…63; арифметический для отрицательных
/целочисленное делениерезультат — обычное число при наличии остатка
%остаток
^степеньпоказатель проверяется; отрицательный показатель даёт обычное число

Все значения здесь — точные целые: 0x7FFFFFFFFFFFFFFF = 9223372036854775807, а переполнение — видимая ошибка: никогда не «обёртка» и не тихо округлённое число. Слова and/or/xor контекстны: два целых делают их побитовыми, два логических делают and/or логическими, а смешение типов в одном операторе — строгая ошибка. Используйте явные скобки на границах.

Полный приоритет операторов описан в операторах и логике.

Проверенные примеры

0x1F + 1              → 0x20
0x1F in decimal       → 31
0b101101 + 1          → 0b101110
0o55 + 1              → 0o56
0x1_0                 → 0x10
100_000 as hex        → 0x186A0
256 as hex            → 0x100
16 in binary          → 0b10000
-0x10                 → -16
1 << 4                → 16
32 >> 2               → 8
0xFF & 0x0F           → 0x0F
5 | 2                 → 7
6 xor 3               → 5
5 << 3                → 40
(5 << 3) / 2          → 20

x = 0x1F
x & 1                 → 1
x + 1                 → 0x20
x as hex              → 0x1F

Последние четыре строки выполняются на одном листе, где x объявлена один раз.

Связанные разделы

Нашли ошибку в документации? Сообщите о ней на GitHub