Числовые форматы в программировании

Как языки обрабатывают числа

Разобраться в числовых форматах

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

Целочисленные типы

Целые числа фиксированного размера

ТипБитыДиапазон со знакомДиапазон без знака
int88-128 до 1270 до 255
int1616-32 768 до 32 7670 до 65 535
int3232-2,1 млрд до 2,1 млрд0 до 4,3 млрд
int6464±9,2 квинтиллиона0 до 18,4 квинтиллиона

Примеры в языках

  • C/C++: int, long, int32_t, uint64_t
  • Java: byte, short, int, long
  • Rust: i8, i16, i32, i64, u8, u16, u32, u64
  • Go: int8, int16, int32, int64

Числа с плавающей точкой

Стандарт IEEE 754

  • float (32 бита): ~7 знаков точности
  • double (64 бита): ~15–16 знаков точности

Структура

  • Бит знака (1 бит)
  • Экспонента (8 или 11 бит)
  • Мантисса/значащая часть (23 или 52 бита)

Известная проблема

0.1 + 0.2 = 0.30000000000000004

Это происходит потому, что 0.1 и 0.2 невозможно точно представить в двоичной плавающей точке.

Запись числовых оснований по языкам

ЯзыкДвоичноеВосьмеричноеHEX
JavaScript0b10100o120x0A
Python 30b10100o120x0A
C/C++/Java0b1010*0120x0A
C#0b10100x0A
Ruby0b10100o120x0A
Go0b10100o120x0A
Rust0b10100o120x0A

*C: двоичные литералы добавлены в C23; C++14 и Java 7+ поддерживают их.

Числа в JavaScript

Характеристики

  • Все числа — 64-битные с плавающей точкой (IEEE 754)
  • Безопасный диапазон целых: ±9 007 199 254 740 991 (2⁵³-1)
  • BigInt для больших целых чисел (ES2020+)

Числовые литералы

let dec = 255;        // Десятичное
let hex = 0xFF;       // Шестнадцатеричное
let bin = 0b11111111; // Двоичное
let oct = 0o377;      // Восьмеричное
let big = 9007199254740992n; // BigInt

Подводные камни

  • 0.1 + 0.2 !== 0.3 (плавающая точка)
  • parseInt('08') === 8 (исправлено в современном JS)

Числа в Python

Характеристики

  • Целые числа имеют произвольную точность (нет переполнения)
  • Числа с плавающей точкой — 64-битные IEEE 754
  • Комплексные числа встроены в язык

Числовые литералы

dec = 255          # Десятичное
hex_num = 0xFF     # Шестнадцатеричное  
bin_num = 0b11111111  # Двоичное
oct_num = 0o377    # Восьмеричное
complex_num = 3+4j # Комплексное

Преобразования

bin(255)  # '0b11111111'
hex(255)  # '0xff'
oct(255)  # '0o377'
int('FF', 16)  # 255

Числа произвольной точности

Когда они нужны

  • Криптография (большие ключи)
  • Финансовые расчёты (точное десятичное представление)
  • Научные вычисления (сверхвысокая точность)

Поддержка в языках

  • Python: int (всегда произвольная точность)
  • JavaScript: BigInt (для целых чисел)
  • Java: BigInteger, BigDecimal
  • C#: BigInteger, decimal

Пример: BigInt в JavaScript

const big = 9007199254740993n;
const result = big * 2n;  // Необходимо использовать суффикс n

Форматированный вывод

JavaScript

num.toString(2)   // Двоичная строка
num.toString(16)  // HEX-строка
num.toFixed(2)    // 2 десятичных знака

Python

f"{255:b}"    # '11111111' (двоичное)
f"{255:x}"    # 'ff' (HEX)
f"{255:08b}"  # '11111111' (с дополнением)

C/C++

printf("%d", num);   // Десятичное
printf("%x", num);   // HEX (строчные)
printf("%X", num);   // HEX (прописные)
printf("%o", num);   // Восьмеричное

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

Доступны в большинстве языков для целочисленных типов:

ОперацияСимволПример
AND&5 & 3 = 1
OR|5 | 3 = 7
XOR^5 ^ 3 = 6
NOT~~5 = -6
Сдвиг влево<<5 << 1 = 10
Сдвиг вправо>>5 >> 1 = 2

Заключение

Языки программирования обрабатывают числа с помощью различных типов: целочисленных фиксированного размера (int32, int64), с плавающей точкой (float, double) и произвольной точности (BigInt, BigDecimal). Понимание записи систем счисления (префиксы 0b, 0o, 0x) и ограничений каждого типа — особенно проблем с точностью плавающей точки — помогает избегать тонких ошибок. Когда важна точная десятичная арифметика (финансы, валюты), используйте специализированные десятичные типы вместо плавающей точки.

Похожие статьи

Числовые форматы в программировании: руководство по языкам | YounitConverter