为什么__builtin_clzll(variable)在变量为0时返回随机数,而在值为0时直接返回64?

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

细节

您好,我是 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?
}

问题:

  • 当我使用变量(x = 0)时,__builtin_clzll(x) 输出一个随机数。
  • 但是,当我直接使用常量 0 时,__builtin_clzll(0) 正确输出 64(因为 0 有 64 个前导零)。

为什么当使用变量而不是常量 0 时会出现这种差异?这种行为是预期的吗?这可能与变量的处理方式有关吗?

谢谢您的帮助!

如果我无法立即回复您的答复,请提前致歉。预先感谢您!

我尝试过的:我尝试将 __builtin_clzll 函数与设置为 0 的变量一起使用。

我的期望:我期望它返回 64,因为 0 有 64 个前导零。

发生了什么:但是,该函数返回了一个随机数,而不是 64。

c++ built-in bitset
1个回答
0
投票

来自 gcc 其他内置函数

int __builtin_clzll (unsigned long long)

与 __builtin_clz 类似,但参数类型为

unsigned long long

 int __builtin_clz (unsigned int x)

返回 x 中前导 0 位的数量,从最高有效位位置开始。如果

x
为 0,则结果未定义。

因此,当

x
为 0 时,结果是不确定的。不要用 0 调用它 - 或使用标准函数
std::countl_zero
为您进行零检查。

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