首页 > 解决方案 > C 程序如何显示最大可能 unsigned long long 的值?

问题描述

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

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

int main(void) 
{
    printf ("%llu\n" , ( unsigned long long int ) ( pow (2 ,  8 * sizeof (unsigned long long) ) - 1 ) ) ;

    return 0;
}

标签: cinteger-overflow

解决方案


该函数pow返回一个double,通常是一个带有 53 位尾数的 64 位浮点类型。这不足以以1 的粒度解析 2 64附近的数字。

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

如果需要尽可能大的值unsigned long long,可以使用ULLONG_MAXfrom <limits.h>

printf ("%llu\n", ULLONG_MAX);    // need <limits.h>

一个的补码(unsigned long long) 0- anunsigned long long所有位都设置了 - 也应该工作:

printf ("%llu\n", ~0ull);

推荐阅读