g cc 7.3 128-битное целое число без знака - PullRequest
0 голосов
/ 26 марта 2020

Я запутался с использованием 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 ]

1 голос
/ 26 марта 2020

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

Вместо

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

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

0 голосов
/ 26 марта 2020

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

В G CC нет поддержки для выражения целочисленной константы типа __int128 для целей с длинным длинным целым числом меньше, чем Ширина 128 бит.

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

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

...