У меня есть такой код:
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
Если вы посмотрите на документация gcc за __builtin_ctz
у нас есть:
Встроенная функция:
int __builtin_ctz (unsigned int x)
Возвращает количество завершающих 0 битов в x, начиная с позиции младшего разряда. Если х равен 0, результат не определено. [акцент мой]
Не определено не определено. Полностью произвольные числа, которые вы видите в результате, находятся в пределах «неопределенных».
Вы не можете использовать __builtin_clz со значением 0
документы говорит:
— Встроенная функция: int __builtin_clz (unsigned int x) Возвращает
количество ведущих 0-битов в x, начиная с самого старшего бита
позиция. Если х равен 0, результат не определен