我有一些这样的代码:
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
如果您查看 gcc 文档 的
__builtin_ctz
,我们有:
内置功能:
int __builtin_ctz (unsigned int x)
返回 x 中尾随 0 位的数量,从最低有效位位置开始。如果 x 为 0,则结果为“未定义”。 [强调我的]
未定义就是未定义。您看到的结果完全任意的数字完全在“未定义”的范围内。