#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
?
Ответы:
Используйте модификатор long (long) ll (el-el) с преобразованием u (без знака). (Работает в windows, GNU).
источник
long long
аргументовprintf
и используете неправильный формат для одного из них, скажем,%d
вместо%lld
, то даже аргументы, напечатанные после неправильного, могут быть полностью отключены (или даже могут привестиprintf
к сбою). ). По сути, переменные аргументы передаются в printf без какой-либо информации о типе, поэтому, если строка формата неверна, результат непредсказуем.Вы можете попробовать использовать библиотеку inttypes.h, которая предоставляет такие типы, как
int32_t
,int64_t
иuint64_t
т. Д. Затем вы можете использовать ее макросы, такие как:Это «гарантированно» не даст вам таких же проблем, как
long
иunsigned long long
т. Д., Так как вам не нужно угадывать, сколько битов в каждом типе данных.источник
PRId64
,PRId32
определенные макросы?inttypes.h
PRIu64
иPRIu32
для целых чисел без знака.inttypes.h
стандарт? Не будет ли этоstdint.h
?leastX
иfastX
типы (которые на самом деле может быть шире , чем указано иное) являются обязательными.%d
-> дляint
%u
-> дляunsigned int
%ld
-> дляlong int
илиlong
%lu
-> дляunsigned long int
илиlong unsigned int
илиunsigned long
%lld
-> дляlong long int
илиlong long
%llu
-> дляunsigned long long int
илиunsigned long long
источник
Чтобы долго (или __int64) использовать MSVS, вы должны использовать% I64d:
источник
Это связано с тем, что% llu не работает должным образом в Windows и% d не может обрабатывать 64-битные целые числа. Вместо этого я предлагаю использовать PRIu64, и вы обнаружите, что он также переносим на Linux.
Попробуйте это вместо:
Вывод
источник
int64_t
вместо этого, потому что вполне могут быть некоторые реализации с длинным длинным большим, чем длинныйВ Linux это есть,
%llu
а в Windows это%I64u
Хотя я обнаружил, что это не работает в Windows 2000, там, похоже, есть ошибка!
источник
unsigned long long
тип данных является относительно новым (в то время, со стандартом C99), но компиляторами C (включая MinGW / GCC), использующими старую среду выполнения Microsoft C, которая поддерживала только спецификацию C89. У меня есть доступ только к действительно старым и достаточно свежим документам по Windows API. Так что сложно сказать, когда именноI64u
была добавлена поддержка. Но это похоже на эпоху XP.Скомпилируйте его как x64 с VS2005:
источник
В дополнение к тому, что люди написали много лет назад:
main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]
printf("%llu\n", k);
Тогда ваша версия mingw не по умолчанию c99. Добавьте этот флаг компилятора:
-std=c99
.источник
Очевидно, никто не придумал мультиплатформенное * решение в течение более десяти лет с [2008 года], поэтому я добавлю свое mine. Плз upvote. (Шучу. Мне все равно.)
Решение:
lltoa()
Как пользоваться:
Пример ОП:
В отличие от
%lld
строки формата печати, эта работает для меня в 32-битном GCC в Windows.*) Ну почти мультиплатформенный. В MSVC вам, видимо, нужно
_ui64toa()
вместоlltoa()
.источник
lltoa
.Нестандартные вещи всегда странные :)
для длинной длинной части под GNU это
L
,ll
илиq
и под окнами я считаю, что это
ll
толькоисточник
Hex:
Вывод:
источник
Ну, один из способов - это скомпилировать его как x64 с VS2008
Это работает так, как вы ожидаете:
Для 32-битного кода нам нужно использовать правильный спецификатор формата __int64% I64u. Так и становится.
Этот код работает как для 32-, так и для 64-битных компиляторов VS.
источник