Как отобразить максимальное значение unsigned long long в C?

что я здесь делаю не так?

$ cat size.c
#include<stdio.h>
#include<math.h>

int main() {

printf ("sizeof unsigned int = %d bytes.n", sizeof(unsigned int));
printf ("sizeof unsigned long long = %d bytes.n", sizeof(unsigned long long));

printf ("max unsigned int = %dn", (int)(pow(2, 32) - 1));
printf ("max unsigned long long = %lldn", (unsigned long long)(pow(2, 64) - 1));

}
$ gcc size.c -o size
$ ./size
sizeof unsigned int = 4 bytes.
sizeof unsigned long long = 8 bytes.
max unsigned int = 2147483647
max unsigned long long = -1
$ 

Я жду 18446744073709551615 как выход вместо -1 в последней строке.


хорошо, я полностью пропустил, что я получал неправильное значение для 232 - 1, который должен был быть 4294967295, а не 2147483647. Вещи делают сейчас больше смысла.

5 ответов


использовать %llu, а не %lld. d для целых чисел со знаком, так printf отображает его как целое давно.


просто не предполагайте, что он имеет определенное значение use ULLONG_MAX


unsigned long long ulTestMax = -1;
printf ("max unsigned long long = %llu\n", ulTestMax );

это работает на C++, должно работать и здесь.


Edit: изменено ~0 на (тип) -1 в соответствии с предложением Кристофа. См. комментарии ниже.

вы можете получить максимальное значение беззнакового типа следующим образом:

unsigned long long x = (unsigned long long) -1;

легче, верно? =). Во-вторых, вы говорите printf() для интерпретации данной переменной как длинного длинного десятичного знака, который подписан. Попробуйте вместо этого:

unsigned long long x = (unsigned long long) -1;
printf("%llu", x);

%llu означает "длинный длинный без знака".


кто бы ни сделал -1 Кириллу Кирову post pls посмотрите здесь:

безопасно ли использовать -1 для установки всех битов в true? Динго пост

в Кирилл посте требуется только небольшая модификация относительно расширения знака:

unsigned long long ulTestMax = -1LLu; 

-1-антипаттерн, он будет делать работу, если u не хочет идти с решением, предоставленным lmits.h