Как напечатать «unsigned long» в C?

254

Я не могу понять, как печатать unsigned long тип данных в C.

Предположим, что unsigned_foo является unsigned long, затем я пытаюсь:

  • printf("%lu\n", unsigned_foo)
  • printf("%du\n", unsigned_foo)
  • printf("%ud\n", unsigned_foo)
  • printf("%ll\n", unsigned_foo)
  • printf("%ld\n", unsigned_foo)
  • printf("%dl\n", unsigned_foo)

И все они печатают какой-то -123123123 номер вместо unsigned long, который у меня есть.

Теги:
long-integer
printf
unsigned
format-specifiers

7 ответов

359
Лучший ответ

%lu - правильный формат для unsigned long. Похоже, что здесь есть другие проблемы, такие как повреждение памяти или неинициализированная переменная. Возможно, покажите нам большую картину?

  • 9
    К сожалению, %lu работал на этот раз. Благодарю. Что-то еще должно было случиться раньше, и это не сработало.
  • 0
    @bodacydo: Если у вас есть ошибка, она может появиться в полуслучайном виде ... убедитесь, что ваша переменная имеет допустимое значение, прежде чем пытаться ее распечатать.
Показать ещё 4 комментария
21

Из всех выбранных вами комбинаций %ld и %lu являются единственными, которые действительно являются спецификаторами формата printf. %lu (длинный беззнаковый десятичный знак), %lx или %lx (длинный шестнадцатеричный код с строчными или прописными буквами) и %lo (long восьмеричный) являются единственными допустимыми спецификаторами формата для переменной типа unsigned long (конечно вы можете добавлять модификаторы ширины поля, точности и т.д. между % и l).

  • 1
    % ld будет работать нормально до значения std :: numeric_limits <unsigned long> :: max () / 2. Выше этого% ld будет напечатано неправильное значение (отрицательное значение).
  • 1
    @KaushikAcharya: Нет, выше, это UB. И до этого, возможно, даже UB, так как printf определен как требующий точных правильных типов аргументов без va_arg которые имел бы va_arg .
13
  • %lu для unsigned long
  • %llu для unsigned long long
  • 8
    Соглашение Йоды: "unsigned long" "(l) ong (u) nsigned" is.
7

Правильный спецификатор для unsigned long - %lu.

Если вы не получаете точного значения, которое вы ожидаете, в вашем коде могут быть некоторые проблемы.

Скопируйте код здесь. Тогда, может быть, кто-то может лучше сказать, в чем проблема.

6

Для int %d

Для long int %ld

Для long long int %lld

Для unsigned long long int %llu

6
int main()
{
    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();
}

Это будет полезно.,.

6

Формат %lu.

Пожалуйста, ознакомьтесь с различными типами данных и их использованием в printf здесь

  • 2
    Там описано различное нестандартное поведение, не помечая его как нестандартное. POSIX - это самый простой доступный онлайн-стандарт для printf; расширения, превышающие ISO C, помечены тегом «CX»: opengroup.org/onlinepubs/9699919799/functions/fprintf.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню