Ответ 1
Используйте %llu
, а не %lld
. d
для целых чисел со знаком, поэтому printf
отображает его как долго подписанный.
Что я здесь делаю неправильно?
$ 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. Теперь все имеет смысл.
Используйте %llu
, а не %lld
. d
для целых чисел со знаком, поэтому printf
отображает его как долго подписанный.
Просто не думайте, что оно имеет определенное значение ULLONG_MAX
Изменить: изменилось с ~ 0 на (тип) -1 согласно предложению Кристофа. См. Комментарии ниже.
Максимальное значение неподписанного типа можно получить, выполнив следующие действия:
unsigned long long x = (unsigned long long) -1;
Легче, не так ли? знак равно Во-вторых, вы сообщаете printf()
интерпретировать данную переменную как длинную десятичную дробь, которая подписана. Вместо этого попробуйте:
unsigned long long x = (unsigned long long) -1;
printf("%llu", x);
%llu
означает "long long unsigned".
unsigned long long ulTestMax = -1;
printf ("max unsigned long long = %llu\n", ulTestMax );
это работает на С++, также должно работать здесь.
Кто бы ни сделал -1 для Кирилла Кирова, пожалуйста, загляните сюда:
Можно ли использовать -1 для установки всех битов в true? Сообщение Dingo
В сообщении Кирилла требуется только небольшая модификация для расширения знака:
unsigned long long ulTestMax = -1LLu;
-1 является антипаттерном, он выполнит эту работу, если вы не захотите пойти с решением, предоставленным lmits.h