__builtin_clz() 为负数[重复]

问题描述 投票:0回答:2

我有一些这样的代码:

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

c++ built-in
2个回答
4
投票

如果您查看 gcc 文档

__builtin_ctz
,我们有:

内置功能:

int __builtin_ctz (unsigned int x)

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

未定义就是未定义。您看到的结果完全任意的数字完全在“未定义”的范围内。


3
投票

文档

说:

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

© www.soinside.com 2019 - 2024. All rights reserved.