Как отобразить максимальное значение длинного без знака в C? - PullRequest
16 голосов
/ 10 октября 2010

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

$ 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 = %d\n", (int)(pow(2, 32) - 1));
printf ("max unsigned long long = %lld\n", (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 в последней строке.


Хорошо, яполностью пропустил, что я получил неправильное значение для 2 32 - 1, который должен был быть 4294967295, а не 2147483647. Теперь все становится более понятным.

Ответы [ 5 ]

28 голосов
/ 10 октября 2010

Только не думайте, что оно имеет определенное значение, используя ULLONG_MAX

19 голосов
/ 10 октября 2010

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

2 голосов
/ 10 октября 2010
unsigned long long ulTestMax = -1;
printf ("max unsigned long long = %llu\n", ulTestMax );

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

2 голосов
/ 10 октября 2010

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

Максимальное значение типа без знака можно получить, выполнив следующие действия:

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

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

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

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

0 голосов
/ 10 октября 2010

Кто бы ни сделал -1 для Кирилла Кирова, пожалуйста, посмотрите здесь:

Безопасно ли использовать -1, чтобы установить все биты в true? Dingo post

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

unsigned long long ulTestMax = -1LLu; 

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

...