В C (99), LLONG_MAX
максимальное значение типа long long int
гарантированно будет не менее 9223372036854775807
. Максимальное значение unsigned long long int
гарантированно должно быть не менее 18446744073709551615
, что составляет 2 64 & minus; 1 (0xffffffffffffffff
).
Итак, инициализация должна быть:
unsigned long long int largestIntegerInC = 18446744073709551615ULL;
(Обратите внимание на ULL
.) Поскольку largestIntegerInC
имеет тип unsigned long long int
, вы должны напечатать его с правильным спецификатором формата, который является "%llu"
:
$ cat test.c
#include <stdio.h>
int main(void)
{
unsigned long long int largestIntegerInC = 18446744073709551615ULL;
/* good */
printf("%llu\n", largestIntegerInC);
/* bad */
printf("%d\n", largestIntegerInC);
return 0;
}
$ gcc -std=c99 -pedantic test.c
test.c: In function ‘main’:
test.c:9: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long long unsigned int’
Второй printf()
выше неправильный, он может напечатать что угодно. Вы используете "%d"
, что означает, что printf()
ожидает int
, но получает unsigned long long int
, который (скорее всего) не соответствует размеру int
. Причина, по которой вы получаете -1
в качестве выходных данных, связана с (неудачей) и тем фактом, что на вашем компьютере числа представлены с использованием представления дополнения до двух.
Чтобы увидеть, как это может быть плохо, запустим следующую программу:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(int argc, char *argv[])
{
const char *fmt;
unsigned long long int x = ULLONG_MAX;
unsigned long long int y = 42;
int i = -1;
if (argc != 2) {
fprintf(stderr, "Need format string\n");
return EXIT_FAILURE;
}
fmt = argv[1];
printf(fmt, x, y, i);
putchar('\n');
return 0;
}
На моем MacBook запуск программы с "%d %d %d"
дает мне -1 -1 42
, а на машине с Linux та же программа с тем же форматом дает мне -1 42 -1
. К сожалению.
На самом деле, если вы пытаетесь сохранить наибольшее число unsigned long long int
в вашей переменной largestIntegerInC
, вы должны включить limits.h
и использовать ULLONG_MAX
. Или вы должны хранить задание -1
в вашей переменной:
#include <limits.h>
#include <stdio.h>
int main(void)
{
unsigned long long int largestIntegerInC = ULLONG_MAX;
unsigned long long int next = -1;
if (next == largestIntegerInC) puts("OK");
return 0;
}
В приведенной выше программе и largestIntegerInC
, и next
содержат максимально возможное значение для типа unsigned long long int
.