Sprintf для unsigned _int64

У меня есть следующий код. вывод второго% d в sprintf всегда отображается как ноль. Я думаю, что я задаю неправильные спецификации. Может ли кто-нибудь помочь мне получить строку записи с правильными значениями. И это должно быть достигнуто в posix-стандарте. Спасибо за входы

void main() {
    unsigned _int64 dbFileSize = 99;
    unsigned _int64 fileSize = 100;
    char buf[128];
    memset(buf, 0x00, 128);
    sprintf(buf, "\nOD DB File Size = %d bytes \t XML file size = %d bytes", fileSize, dbFileSize);
    printf("The string is %s ", buf);
    }

Вывод:

The string is
OD DB File Size = 100 bytes      XML file size = 0 bytes 

Ответ 1

Я не знаю, что POSIX может сказать об этом, но это хорошо обрабатывается ядром C99:

#include <stdio.h>
#include <inttypes.h>

int main(void) {
    uint64_t dbFileSize = 99;
    uint64_t fileSize = 100;
    char buf[128];
    memset(buf, 0x00, 128);
    sprintf( buf, "\nOD DB File Size = %" PRIu64 " bytes \t"
                  " XML file size = %" PRIu64 " bytes\n"
                  , fileSize, dbFileSize );
    printf( "The string is %s\n", buf );
}

Если ваш компилятор не совместим с C99, получите другой компилятор. (Да, я смотрю на вас, Visual Studio.)

PS: Если вы беспокоитесь о переносимости, не используйте %lld. Это для long long, но нет гарантий, что long long на самом деле совпадает с _int64 (POSIX) или int64_t (C99).

Изменить: Mea culpa - я более или менее безмозглым "ищу и заменю" d _int64 с помощью int64_t, не глядя на то, что делаю. Спасибо за комментарии, указав, что он uint64_t, а не unsigned int64_t. Исправлено.

Ответ 2

Вам нужно использовать % I64u с Visual С++.

Однако, на большинстве компиляторов C/С++, 64-битное целое число длинное. Поэтому примите длинный длинный и используйте % llu.

Ответ 3

Если вы ищете портативное решение, используйте printf macros от <inttypes.h>. Вам может потребоваться определить __STDC_FORMAT_MACROS, чтобы сделать их доступными на С++.