c++built-in

__builtin_clz() is negative


I have some code like this:

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;
    }
}

The output on x = 0 is:

0 587581823
0 -32

And the most strange thing is that __builtin_clz(x1) which is here equal to 587581823 always different random number (some times less than 0) and __builtin_clz(x2) is always -32


Solution

  • If you look on the gcc documentation for __builtin_ctz we have:

    Built-in Function: int __builtin_ctz (unsigned int x)

    Returns the number of trailing 0-bits in x, starting at the least significant bit position. If x is 0, the result is undefined. [emphasis mine]

    Undefined is undefined. The completely arbitrary numbers you see as the result are well within the confines of "undefined".