Как объединить два 64-битных целых в 128-битное целое?
У меня есть 2 64-битных целых числа, и я хотел бы объединить его в одно 128-битное целое число.
uint64_t len_A;
uint64_t len_C;
len_AC= (len_A << 64) | len_C;
GCC не поддерживает uint128_t
,
Есть ли другие способы сделать это?
3 ответа
Прежде всего вы должны решить, как хранить 128-битное целое число. В этом измерении нет встроенного целочисленного типа.
Вы можете хранить целое число, например, как структуру, состоящую из двух 64-битных целых чисел:
typedef struct { uint64_t high; uint64_t low; } int128;
Тогда ответ будет довольно простым.
Вопрос в том, что вы собираетесь делать с этим целым числом дальше.
Как Inspired сказал:
Вопрос в том, что вы собираетесь делать с этим целым числом дальше.
Вы, вероятно, хотите использовать библиотеку произвольной точности, которая обрабатывает это для вас переносимым и надежным способом. Зачем? Потому что вы можете столкнуться с проблемами порядка байтов, например, при выборе верхнего или нижнего целого числа в данном оборудовании.
Даже если вы точно знаете, где будет выполняться код, вам все равно потребуется разработать полный набор функций, которые работают с вашим 128-разрядным целым числом, поскольку не все компиляторы поддерживают 128-разрядный тип (кажется, что GCC поддерживает это тип целых чисел), например, вам нужно будет создать набор функций для основных математических операций.
Вероятно, лучше использовать библиотеку GMP, перейдите по следующей ссылке: http://gmplib.org/
Если ваш GCC не имеет uint128_t
он, безусловно, не имеет 128-битных целых чисел.
Таким образом, вы должны представлять их, например, с такими структурами, как
struct my128int_st {
uint64_t hi, lo;
} ac;
ac.hi = a;
ac.lo = c;