Floating point 将log2()的浮点值转换为int,结果为奇数 #包括 #包括 int main() { printf(“%f\n”,log2((无符号)~0));/*整数的浮点大小*/ printf(“%d\n”,(int)log2((无符号)~0));/*将不会转换为int*/ }

Floating point 将log2()的浮点值转换为int,结果为奇数 #包括 #包括 int main() { printf(“%f\n”,log2((无符号)~0));/*整数的浮点大小*/ printf(“%d\n”,(int)log2((无符号)~0));/*将不会转换为int*/ },floating-point,Floating Point,这将返回32.000000和31!为什么不是32?我稍微更改了您的程序: #include <stdio.h> #include <math.h> int main() { printf("%f\n", log2((unsigned)~0)); /* float size of int */ printf("%d\n", (int)log2((unsigned)~0)); /* will not convert to int */ } 它表明:

这将返回32.000000和31!为什么不是32?

我稍微更改了您的程序:

#include <stdio.h>
#include <math.h>

int main()
{
  printf("%f\n", log2((unsigned)~0));       /* float size of int */
  printf("%d\n", (int)log2((unsigned)~0));  /* will not convert to int */
}
它表明:

printf("%.16e\n", log2((unsigned)~0));       /* float size of int */
3.199999999664098E+01 31 因此,“为什么它转换为31”的答案是
log2((无符号)~0)
介于31和32之间,因为您可以知道
~(无符号)0
略小于232

另一个问题是“为什么浮点数
3.199999999664098e+01
打印为
32.000000
?”。答案是“您还希望它打印成什么?32.000000是最接近的十进制表示形式,点后有6位数字与实际浮点值。”

3.1999999999664098e+01 31