__builtin_clz () отрицательный

У меня есть такой код:

int foo(unsigned long long x) {
unsigned int x1 = (unsigned int)(x >> 32);
unsigned int x2 = (unsigned int)(x);

if (x == 0) {
cout << x1 << " " << __builtin_clz(x1) << endl;
cout << x2 << " " << __biultin_clz(x2) << endl;
}
}

Выход на x = 0 является:

0 587581823
0 -32

И самое странное, что __builtin_clz(x1) который здесь равен 587581823 всегда другое случайное число (в несколько раз меньше 0) и __builtin_clz(x2) всегда -32

2

Решение

Если вы посмотрите на документация gcc за __builtin_ctz у нас есть:

Встроенная функция: int __builtin_ctz (unsigned int x)

Возвращает количество завершающих 0 битов в x, начиная с позиции младшего разряда. Если х равен 0, результат не определено. [акцент мой]

Не определено не определено. Полностью произвольные числа, которые вы видите в результате, находятся в пределах «неопределенных».

4

Другие решения

Вы не можете использовать __builtin_clz со значением 0

документы говорит:

— Встроенная функция: int __builtin_clz (unsigned int x) Возвращает
количество ведущих 0-битов в x, начиная с самого старшего бита
позиция. Если х равен 0, результат не определен

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector