int2026_t
Своё целое знаковое число на 2026 бит: конвертация из int32_t и строки, сложение, вычитание, умножение, деление с переполнением по модулю, сравнение и вывод в поток. Без контейнеров и std::bitset.
Дальше мягкие дедлайны: deadline_1 до 02.11 (×0.85), deadline_2 до 09.11 (×0.65), deadline_3 с 10.11 (×0.5).
Войти, чтобы записаться на сдачуЗадание
Свой тип для целого знакового числа фиксированной длины int2026_t: 2026 значащих бит, включая знаковый, и не больше 254 байт в памяти. Нужно реализовать конвертацию из int32_t и из строки, четыре арифметические операции, сравнение на равенство и вывод в поток — всё без стандартных контейнеров.
is-itmo-c-26, репозиторий labwork2-<ваш GitHub-логин>. Тип описывается в lib/number.h (структура там уже есть, её нужно дополнить), реализация — в lib/number.cpp. Структуру проекта менять и добавлять новые исходные файлы нельзя.Тип
- Диапазон значений: .
sizeof(int2026_t) <= 254— это проверяетstatic_assertв заголовке.- Неиспользуемые биты хранения не расширяют диапазон: если под число отведено больше 2026 бит, лишние значения всё равно недопустимы.
Что реализовать
Сигнатуры уже объявлены в lib/number.h:
int2026_t from_int(int32_t i);
int2026_t from_string(const char* buff);
int2026_t operator+(const int2026_t& lhs, const int2026_t& rhs);
int2026_t operator-(const int2026_t& lhs, const int2026_t& rhs);
int2026_t operator*(const int2026_t& lhs, const int2026_t& rhs);
int2026_t operator/(const int2026_t& lhs, const int2026_t& rhs);
bool operator==(const int2026_t& lhs, const int2026_t& rhs);
bool operator!=(const int2026_t& lhs, const int2026_t& rhs);
std::ostream& operator<<(std::ostream& stream, const int2026_t& value);Правила операций
from_intсохраняет значение исходного числа, включаяINT32_MINиINT32_MAX.from_stringпринимает десятичную строку вида[+-]?[0-9]+: необязательный знак и хотя бы одна цифра. Ведущие нули разрешены,"0","-0"и"+0"— одно и то же число. Число вне диапазона приводится по правилу переполнения.- Деление целочисленное, с округлением к нулю:
-7 / 3 == -2,7 / -3 == -2. operator<<выводит число в любой системе счисления на ваш выбор (десятичная не обязательна), но разные значения должны выводиться по-разному. Возвращает переданный поток, чтобы работали цепочкиstream << a << " " << b.- Деление на ноль, некорректные строки и
nullptrв контракт не входят и тестами не проверяются.
Переполнение
В отличие от стандартных знаковых типов, где переполнение — UB, здесь нужен wrap around: результат берётся по модулю и приводится к диапазону . Правило действует для конвертации из строки, сложения, вычитания, умножения и деления.
| Выражение | Результат |
|---|---|
MAX + 1 | MIN |
MIN - 1 | MAX |
MIN * 2 | 0 |
MIN / -1 | MIN |
Здесь MIN , MAX .
Сборка и тесты
cmake -B build
cmake --build build
ctest -V --test-dir buildТесты на GoogleTest лежат в tests/: конвертации, арифметика, сравнение, вывод и граничные случаи. Пока все тесты и CI не проходят, лаба не засчитана. Дополнять тесты можно, но не обязательно.
В bin/ есть консольное приложение — его можно менять как угодно, чтобы погонять свой код руками. Частью задания оно не является:
cmake --build build --target labwork2 && build/bin/labwork2Теормин
- Стандартные типы данных
- Представление чисел в памяти
- Массивы
- Арифметика указателей
- Структуры
- Объединения
Мягкие дедлайны
| Ветка | Срок | Коэффициент |
|---|---|---|
deadline_0 | до 26.10, 23:59 | 1.0 |
deadline_1 | 27.10 — 02.11, 23:59 | 0.85 |
deadline_2 | 03.11 — 09.11, 23:59 | 0.65 |
deadline_3 | с 10.11 | 0.5 |
Максимум 12 баллов.
Требования
- Только стандартная библиотека C++, стандарт C++23.
- В
libиbinзапрещены стандартные контейнеры (std::vector,std::list,std::stringи другие) иstd::bitset. В тестах их использовать можно. - Структуру проекта не менять, новых исходных файлов не добавлять: всё пишется в
lib/number.hиlib/number.cpp. - Размер типа — не больше 254 байт.
- CI собирает решение
clang++-21с санитайзерами (-fsanitize=address,undefined), поэтому выход за границы массива или чтение неинициализированной памяти роняют тест. - Стиль проверяет clang-tidy: функции, классы и структуры в
CamelCase, переменные вlower_case, поля классов с_на конце, константы вkCamelCase. Именаint2026_t,from_intиfrom_stringзаданы условием и из проверки исключены.
Как сдавать
- Создайте ветку
deadline_0отmainв своём репозитории. - Решайте в этой ветке, коммитьте небольшими логичными порциями.
- Откройте Pull Request из
deadline_0вmain. - Дождитесь отчёта CI в комментарии к PR: там результаты тестов и проверки стиля.
- Если сдаёте после первого дедлайна, ветка называется по дедлайну (
deadline_1,deadline_2,deadline_3), и балл умножается на его коэффициент.

Комментарии0
Пока никто ничего не написал.
Войдите, чтобы оставить комментарий