C (99), LLONG_MAX
에서 long long int
유형의 최대 값은 적어도 9223372036854775807
이되도록 보장됩니다. unsigned long long int
의 최대 값은 적어도 18446744073709551615
, 즉 2 − 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
이 표시됩니다. 출력으로 -1
을 얻는 이유는 (불운) 행운 때문이며 컴퓨터에서 숫자가 2의 보수 표현을 사용하여 표현된다는 사실 때문입니다.나에게 -1 -1 42
을 제공 "%d %d %d"
으로 프로그램을 실행, 내 맥북에
#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;
}
및 리눅스 머신, 같은 프로그램에서 :
은의 다음과 같은 프로그램을 실행할 수 있도록,이 나쁠 수있는 방법을 보려면 같은 형식으로 나에게 -1 42 -1
을 준다. 죄송합니다. 당신이 당신의 largestIntegerInC
변수에 가장 큰 unsigned long long int
번호를 저장하려는 경우
사실, 당신은 limits.h
을 포함 ULLONG_MAX
를 사용해야합니다. 또는 당신은 당신의 변수에 -1
을 assing 저장해야합니다 :
#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
유형에 대해 가능한 최대 값을 포함한다.
아래의 모든 대답은 추측입니다. ** 아무것도 정의되지 않은 동작 **이 허용됩니다. – Jens