我有一些像这样的代码:
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>
答案 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,则结果为未定义