gcc 7.3 128-битная целочисленная операция без знака

Меня смущает использование 128-битных целых чисел. Посмотрите на тестовый код:

uint128_t test_data = 0x00000000FFFFFFFF0101010101010101;
uint64_t test_data_h = test_data  >> 64;
uint64_t test_data_l = test_data ;
printf("test_data 0x %016llx %016llx\n", test_data_h, test_data_l);

Я ожидаю test_data_h быть 0x00000000FFFFFFFF, но результат:

test data 0x 0000000000000000 0101010101010101

Почему это?

2 ответа

Многие компиляторы не поддерживают 128-битные константы.

Вместо

// uint128_t test_data = 0x00000000FFFFFFFF0101010101010101;
uint128_t test_data = (((uint128_t) 0x00000000FFFFFFFF) << 64) | 0x0101010101010101;

Совет: включите все предупреждения компилятора.

GCC не поддерживает 128-битный целочисленный литерал

В GCC нет поддержки для выражения целочисленной константы типа __int128 для целей с длинным длинным целым числом менее 128 бит.

128-битные целые числа

Так что вам придется построить его из более мелких деталей. (high << 64) | low

Другие вопросы по тегам