下面的程序不应该将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附近的数字。
下一个小于264的double
可表示值是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) 0
和unsigned long long
的1 's补码也应该可以工作:
printf ("%llun", ~0ull);