Осуществить вывод 128-битных чисел - C (СИ)
Формулировка задачи:
Хотел бы реализовать их с основными арифметическими операциями. Сначала думал про:
То есть как массив 4-байтовых. Но как осуществлять, например, вывод такого числа, непонятно. Вот пример кода:
typedef unsigned uint128[4];
#include <stdio.h> typedef unsigned uint128[4]; typedef unsigned long long uint64; void Plus(uint128 num1, uint128 num2, uint128 res) { uint64 sum, r = 0; memset(res, 0, 16); for (int i = 3; i >= 0; --i) { sum = (uint64)num1[i] + (uint64)num2[i]; res[i] += sum & 0xffffffffull; if ((sum & 0xffffffff00000000ull) && i) res[i - 1]++; } } void Print(uint128 num) { for (int i = 0; i < 4; ++i) if (num[i]) printf("%X", num[i]); } int main() { uint128 a = { 0, 0, 0, 0xFFFFFFFF }, b = { 0, 0, 0, 0x1234 }, c; Plus(a, b, c); Print(c); getchar(); }
Решение задачи: «Осуществить вывод 128-битных чисел»
textual
Листинг программы
#include <stdio.h> typedef unsigned uint128[4]; typedef unsigned long long uint64; void Plus(uint128 num1, uint128 num2, uint128 res) { uint64 sum, r = 0; memset(res, 0, 16); for (int i = 3; i >= 0; --i) { sum = (uint64)num1[i] + (uint64)num2[i]; res[i] += sum & 0xffffffffull; if ((sum & 0xffffffff00000000ull) && i) res[i - 1]++; } } void Print(uint128 num) { int i = -1; while (!num[++i]); for (; i < 4; ++i) printf("%08X", num[i]); } int main() { uint128 a = { 0, 0, 0xABCDEF, 0xFFFFFFFF }, b = { 0, 0, 0x8965, 0x56781234 }, c; Plus(a, b, c); Print(c); getchar(); }
Объяснение кода листинга программы
Вывод 128-битных чисел
- Включение файла стандартного ввода/вывода
- Объявление типов данных:
- uint128 - массив из 4-х 32-битных чисел, эмулирующий 128-битное число
- uint64 - 64-битное беззнаковое число
- Определение функции Plus:
- Принимает три параметра типа uint128: num1, num2 и res, которые представляют собой 128-битные числа.
- Использует цикл for для обработки каждого 32-битного числа в 128-битных числах num1 и num2.
- Переменная sum используется для хранения суммы двух 32-битных чисел.
- Переменная r используется для хранения остатка от предыдущего вычисления.
- Используется функция memset для инициализации всех элементов массива res нулями.
- Каждое 32-битное число в num1 и num2 сдвигается вправо на 32 бита, чтобы получить 64-битное число.
- Сумма двух 64-битных чисел записывается в первый 64-битный элемент результата.
- Если сумма двух 64-битных чисел больше 4 ГБ, то увеличивается второй 64-битный элемент результата.
- Определение функции Print:
- Принимает один параметр типа uint128 - num, представляющий собой 128-битное число.
- Использует цикл while для поиска первого ненулевого элемента в массиве num.
- Используется функция printf для вывода каждого 32-битного числа в 16-ричной системе счисления.
- Определение переменных и основной функции:
- Объявление трех переменных типа uint128: a, b и c, которые представляют собой 128-битные числа.
- Инициализация переменных a и b значениями 0.
- Третий элемент переменной a инициализируется значением 0xABCDEF, а третий элемент переменной b инициализируется значением 0x8965.
- Вызов функции Plus для переменной c с аргументами a и b.
- Вызов функции Print для переменной c.
- Вызов функции getchar для ожидания нажатия клавиши. Код выполняет сложение двух 128-битных чисел и вывод результата в 16-ричной системе счисления.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д