Как вы форматируете unsigned long long int, используя printf?
677236 просмотра
12 ответа
#include <stdio.h>
int main() {
unsigned long long int num = 285212672; //FYI: fits in 29 bits
int normalInt = 5;
printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
return 0;
}
Выход:
My number is 8 bytes wide and its value is 285212672l. A normal number is 0.
Я предполагаю, что этот неожиданный результат от печати unsigned long long int
. Как вам printf()
Согласовать unsigned long long int
?
Ответы (12)
409 плюса
Используйте модификатор long (long) для ll (el-el) с преобразованием u (без знака). (Работает в windows, GNU).
printf("%llu", 285212672);
Автор: John Downey
Размещён: 05.08.2008 09:02
80 плюса
Вы можете попробовать использовать библиотеку inttypes.h, которая предоставляет вам такие типы, как
int32_t
, int64_t
и uint64_t
т. Д. Затем вы можете использовать ее макросы, такие как:
uint64_t x;
uint32_t y;
printf("x: %"PRId64", y: %"PRId32"\n", x, y);
Это «гарантированно» не даст вам таких же проблем, как long
и unsigned long long
т. Д., Так как вам не нужно угадывать, сколько битов в каждом типе данных.
49 плюса
%d
-> для int
%u
-> для unsigned int
%ld
-> для long int
%lu
-> для unsigned long int
%lld
-> для long long int
%llu
-> для unsigned long long int
36 плюса
Для длительного (или __int64) использования MSVS вы должны использовать% I64d:
__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b); //I is capital i
Автор: Steven
Размещён: 06.09.2009 02:26
32 плюса
Это связано с тем, что% llu не работает должным образом в Windows и% d не может обрабатывать 64-битные целые числа. Вместо этого я предлагаю использовать PRIu64, и вы также обнаружите, что он переносим на Linux.
Попробуйте это вместо этого:
#include <stdio.h>
#include <inttypes.h>
int main() {
unsigned long long int num = 285212672; //FYI: fits in 29 bits
int normalInt = 5;
/* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
printf("My number is %d bytes wide and its value is %" PRIu64 ". A normal number is %d.\n", sizeof(num), num, normalInt);
return 0;
}
Выход
My number is 8 bytes wide and its value is 285212672. A normal number is 5.
Автор: Paul Hargreaves
Размещён: 09.09.2008 07:54
12 плюса
В Linux это есть, %llu
а в Windows это%I64u
Хотя я обнаружил, что это не работает в Windows 2000, там, похоже, есть ошибка!
Автор: Adam Pierce Размещён: 11.09.2008 12:578 плюса
4 плюса
Нестандартные вещи всегда странные :)
для длинной длинной части под GNU это L
, ll
илиq
и под окнами я считаю, что это ll
только
4 плюса
Hex:
printf("64bit: %llp", 0xffffffffffffffff);
Выход:
64bit: FFFFFFFFFFFFFFFF
Автор: lama12345
Размещён: 26.07.2015 09:57
2 плюса
В дополнение к тому, что люди написали много лет назад:
- Вы можете получить эту ошибку в gcc / mingw:
main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]
printf("%llu\n", k);
Тогда ваша версия mingw не по умолчанию c99. Добавьте этот флаг компилятора: -std=c99
.
0 плюса
Ну, один из способов это скомпилировать как x64 с VS2008
Это работает так, как вы ожидаете:
int normalInt = 5;
unsigned long long int num=285212672;
printf(
"My number is %d bytes wide and its value is %ul.
A normal number is %d \n",
sizeof(num),
num,
normalInt);
Для 32-битного кода нам нужно использовать правильный спецификатор формата __int64% I64u. Так и становится.
int normalInt = 5;
unsigned __int64 num=285212672;
printf(
"My number is %d bytes wide and its value is %I64u.
A normal number is %d",
sizeof(num),
num, normalInt);
Этот код работает как для 32-, так и для 64-битных компиляторов VS.
Автор: vzczc Размещён: 05.08.2008 09:400 плюса
По-видимому, никто не придумал мультиплатформенное * решение в течение более десяти лет с [2008 года], поэтому я добавлю свое 😛. Плз upvote. (Шучу. Мне все равно.)
В двух словах:
#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s\n", lltoa(5555555555, dummy, 10));
printf("Another one: %s\n", lltoa(15555555555, dummy, 10));
Пример ОП:
#include <stdio.h>
#include <stdlib.h> /* lltoa() */
int main() {
unsigned long long int num = 285212672; // fits in 29 bits
char dummy[255];
int normalInt = 5;
printf("My number is %d bytes wide and its value is %s. "
"A normal number is %d.\n",
sizeof(num), lltoa(num, dummy, 10), normalInt);
return 0;
}
В отличие от %lld
строки формата печати, эта работает для меня в GCC на Windows.
*) Ну почти мультиплатформенный. В MSVC вам, видимо, нужно _ui64toa
вместо lltoa
.
Вопросы из категории :
- c Как вы форматируете unsigned long long int, используя printf?
- c What are the barriers to understanding pointers and what can be done to overcome them?
- c Как реализовать продолжения?
- c Как вы передаете функцию в качестве параметра в C?
- syntax Что ** (двойная звезда / звездочка) и * (звездочка / звездочка) делают для параметров?
- syntax Может кто-нибудь объяснить __all__ в Python?
- printf Печать ведущих 0 в C?
- printf Избегайте конечных нулей в printf ()
- printf Левый блокнот с пробелами
- format-specifiers В чем разница между спецификаторами преобразования% i и% d в отформатированных функциях ввода-вывода (* printf / * scanf)
- format-specifiers Независимый от платформы size_t Спецификаторы формата в c?
- format-specifiers Есть ли спецификатор формата, который всегда означает строку символов с _tprintf?
- long-long Какой тип данных "длинный длинный"?
- long-long Проблема округления при использовании длинных длин на ПИК
- long-long удаление усеченного целочисленного деления