Числовые форматы в программировании
Как языки обрабатывают числа
Разобраться в числовых форматахКаждый язык программирования нуждается в способах представления чисел. Понимание целочисленных типов, форматов с плавающей точкой и записи чисел в различных системах счисления помогает писать корректный код и избегать тонких ошибок, связанных с точностью, переполнением и представлением данных.
Целочисленные типы
Целые числа фиксированного размера
| Тип | Биты | Диапазон со знаком | Диапазон без знака |
|---|---|---|---|
| int8 | 8 | -128 до 127 | 0 до 255 |
| int16 | 16 | -32 768 до 32 767 | 0 до 65 535 |
| int32 | 32 | -2,1 млрд до 2,1 млрд | 0 до 4,3 млрд |
| int64 | 64 | ±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 |
|---|---|---|---|
| JavaScript | 0b1010 | 0o12 | 0x0A |
| Python 3 | 0b1010 | 0o12 | 0x0A |
| C/C++/Java | 0b1010* | 012 | 0x0A |
| C# | 0b1010 | — | 0x0A |
| Ruby | 0b1010 | 0o12 | 0x0A |
| Go | 0b1010 | 0o12 | 0x0A |
| Rust | 0b1010 | 0o12 | 0x0A |
*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) и ограничений каждого типа — особенно проблем с точностью плавающей точки — помогает избегать тонких ошибок. Когда важна точная десятичная арифметика (финансы, валюты), используйте специализированные десятичные типы вместо плавающей точки.