2013-08-07 2 views
14

Мне нужно напечатать значение ULONGLONG (unsigned __int64). Какой формат следует использовать в printf? Я нашел %llu в другом вопросе, но они говорят, что это только для Linux.Формат printf для неподписанных __int64 для Windows

Благодарим за помощь.

+0

Вы можете использовать зЬй :: COUT? Он должен просто работать. –

+0

Не могу. Функция, которую я использую, представляет собой оболочку с переменным списком аргументов, которая использует printf и которую я не могу изменить. – Virus721

+0

Читайте также: [Смешная вещь с sprintf] (http://stackoverflow.com/questions/17065203/a-funny-thing-with-sprintf/17065245#17065245) –

ответ

23

Использование Google для поиска «Visual Studio PRINTF без знака __int64» производит this page как первый результат, который говорит, что вы можете использовать префикс I64, поэтому формат спецификатор будет %I64u.

+0

Кажется работать. Благодаря ! – Virus721

+1

Другим выбором является макрос 'PRIu64', определенный в' inttypes.h' –

+0

@GrijeshChauhan: 'PRIu64' и' inttypes.h' не поддерживаются в Visual Studio (по крайней мере, не Microsoft). –

1

Printf имеет различные спецификации формата для unsigned long long в зависимости от компилятора, я видел %llu и %Lu. В общем, я бы посоветовал вам использовать std::cout и аналогичный.

+1

Вопрос отмечен как «c», так и «C++». В C 'std :: cout' является не более чем синтаксической ошибкой. –

6

%llu - стандартный способ печати unsigned long long, это не только для Linux, но и на C99. Поэтому на самом деле проблема заключается в использовании C99-совместимого компилятора, то есть не Visual Studio.

C99 7.19.6 Форматированный функции ввода/вывода

LL (ELL-ELL) Указывает, что следующий д, I, O, и, применяется х, или Х спецификатор преобразования к долго long int или unsigned long long int аргумент; или что следующий указатель преобразования n применяется к указателю на длинный аргумент int.

+2

Я бы не стал беспокоиться об этом, если бы мог выбрать, с каким программным обеспечением я работаю. – Virus721

+1

К сожалению, Microsoft не определяет 'ULONGLONG' как' unsigned long long'. Per [this page] (http://msdn.microsoft.com/en-us/library/cc230393.aspx), это 'unsigned __int64'.Использование формата для 'unsigned long long' может работать или не работать, но если вы хотите, чтобы ваш код выдержал обновления компилятора и будущие миграции, вы должны придерживаться спецификации типа. –

+0

@ Virus721 В вашем вопросе говорится, что вам нужно использовать его в Windows, не говоря о Visual Studio. –

2

Я рекомендую использовать формат PRIu64, указанный в стандартной библиотеке C. Он был разработан для предоставления пользователям спецификатора формата для неподписанного 64-битного целого в разных архитектурах.

Вот пример (в C, а не C++):

#include <stdint.h> /* For uint64_t */ 
#include <inttypes.h> /* For PRIu64 */ 
#include <stdio.h> /* For printf */ 
#include <stdlib.h> /* For exit status */ 

int main() 
{ 
    uint64_t n = 1986; 
    printf("And the winning number is.... %" PRIu64 "!\n", n); 
    return EXIT_SUCCESS; 
} 
+3

Visual Studio не поддерживает 'stdint.h' или' inttypes.h'. Он не поддерживает C 1999. Существуют [сторонние реализации] (http://code.google.com/p/msinttypes/). –

+2

@EricPostpischil: Ребята в Microsoft полностью потеряли рассудок? :( –

+1

Спасибо за вашу помощь, но% I64d выполняет эту работу. – Virus721

0

Вот работа вокруг для вывода HEX

printf("%08X%08X", static_cast<UINT32>((u64>>32)&0xFFFFFFFF), static_cast<UINT32>(u64)&0xFFFFFFFF)); 
Смежные вопросы