Как объединить два 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;
Другие вопросы по тегам