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