Подтвердить что ты не робот

Как печатать 64-битное целое число в GCC 4.4.1?

Я использую Code:: Blocks с GCC 4.4.1, и я, кажется, не могу распечатать 64-битные целые числа со знаком с моего C -код.

Этот код:

long long longint;

longint = 0x1BCDEFABCDEFCDEF; /* 2003520930423229935 */
printf("Sizeof: %d-bit\n", sizeof(longint) * 8);     /* Correct */
printf("%llx\n", longint);                           /* Incorrect */
printf("%x%x\n", *(((int*)(&longint))+1), longint);  /* Correct */
printf("%lld\n", longint);                           /* Incorrect */ 

Производит вывод:

Sizeof: 64-bit
cdefcdef
1bcdefabcdefcdef
-839922193

64-разрядная арифметика работает корректно:

longint -= 0x1000000000000000;
printf("%x%x\n", *(((int*)(&longint))+1), longint);

дает:

bcdefabcdefcdef

Я что-то пропустил?

4b9b3361

Ответ 1

Смотрите, помогает ли %I64d. %lld отлично подходит для long long int, но иногда все происходит по-разному в Windows IDE

Ответ 2

В (на C99 и выше) портативно печатайте 64-битные целые числа, вы должны #include <inttypes.h> и использовать макросы C99 PRIx64 и PRId64. Это сделает ваш код;

printf("Sizeof: %d-bit\n", sizeof(longint) * 8);
printf("%" PRIx64 "\n", longint);
printf("%" PRId64 "\n", longint);

Изменить: см. этот вопрос для получения дополнительных примеров.

Ответ 3

Это зависит от ОС. Если вы делаете это примерно на любом GCC, который использует GLIBC, то работает% llx.

Однако, если вы используете компилятор mingw, тогда это использует библиотеки Microsoft, и вам нужно изучить их документацию.

Это изменяет вашу программу на:

longint = 0x1BCDEFABCDEFCDEFLL; /* 2003520930423229935 */
printf("Sizeof: %d-bit\n", sizeof(longint) * 8);     /* Correct */
printf("%I64x\n", longint);                           /* Incorrect */
printf("%x%x\n", *(((int*)(&longint))+1), longint);  /* Correct */
printf("%I64d\n", longint);

Ответ 4

Наконец-то получил:

longint = 0x1BCDEFABCDEFCDEF; /* 2003520930423229935 */
printf("%I64d\n", longint);
printf("%I64x\n", longint);

Печать

2003520930423229935
1bcdefabcdefcdef

Спасибо @npclaudiu!