__builtin_clz()是否定的

时间:2014-12-20 18:21:55

标签: c++ built-in

我有一些像这样的代码:

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 < / p>

2 个答案:

答案 0 :(得分:4)

如果您查看__builtin_ctz int __builtin_ctz (unsigned int x),我们有:

  

内置函数:{{1}}

     

从最低有效位开始,返回x中的尾随0位数。如果x为0,则结果为未定义。 [强调我的]

未定义未定义。你看到的完全任意数字都是在#34; undefined&#34;的范围内。

答案 1 :(得分:3)

您不能将__builtin_clz的值设为0

docs说:

  

- 内置函数:int __builtin_clz(unsigned int x)返回   x中前导0位的数量,从最高有效位开始   位置。如果x为0,则结果为未定义