C程序如何显示最大的unsigned long的值?



下面的程序不应该将2^64 -1的值打印为整数吗?

#include <stdio.h>
#include <math.h>
int main(void) 
{
printf ("%llun" , ( unsigned long long int ) ( pow (2 ,  8 * sizeof (unsigned long long) ) - 1 ) ) ;
return 0;
}

函数pow返回double,通常为64位浮点类型,尾数为53位。这不足以解析粒度为1的264附近的数字。

下一个小于264double可表示值是264−2048 = 264−211。264−1仍然是264,这是最接近的可表示值。将其转换为unsigned long long,得到0。

如果需要unsigned long long的最大值,可以使用<limits.h>中的ULLONG_MAX:

printf ("%llun", ULLONG_MAX);    // need <limits.h>

(unsigned long long) 0unsigned long long的1 's补码也应该可以工作:

printf ("%llun", ~0ull);

最新更新