您好,我是 Stack Overflow 的新手,这是我第一次提问。
我试图了解
__builtin_clzll
函数的工作原理,但在使用变量而不是直接 0 时遇到意外行为。这是一个最小的示例:
#include <iostream>
using namespace std;
int main() {
unsigned long long x = 0;
cout << __builtin_clzll(x) << endl; // Why does this output a random number, like 119030102.
cout << __builtin_clzll(0) << endl; // Why does this output 64?
}
为什么当使用变量而不是常量 0 时会出现这种差异?这种行为是预期的吗?这可能与变量的处理方式有关吗?
谢谢您的帮助!
如果我无法立即回复您的答复,请提前致歉。预先感谢您!
我尝试过的:我尝试将 __builtin_clzll 函数与设置为 0 的变量一起使用。
我的期望:我期望它返回 64,因为 0 有 64 个前导零。
发生了什么:但是,该函数返回了一个随机数,而不是 64。
来自 gcc 其他内置函数:
int __builtin_clzll (unsigned long long)
:
与 __builtin_clz 类似,但参数类型为
。unsigned long long
int __builtin_clz (unsigned int x)
:
返回 x 中前导 0 位的数量,从最高有效位位置开始。如果
为 0,则结果未定义。x
因此,当
x
为 0 时,结果是不确定的。不要用 0 调用它 - 或使用标准函数 std::countl_zero
为您进行零检查。