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


344

Я никогда не могу понять, как напечатать 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что у меня есть.

Ответы:


499

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


12
Ой, %luсработало на этот раз. Спасибо. Что-то еще должно было случиться раньше, и это не сработало.
Бодасидо

1
@bodacydo: Если у вас есть ошибка, она может появиться в полуслучайном виде ... убедитесь, что ваша переменная имеет допустимое значение, прежде чем пытаться ее распечатать.
Танатос

1
Даже если переменная неинициализирована, printf не должен достигать точки, в которой он мог бы печатать знак минус, когда был указан спецификатор формата %lu. Технически это неопределенное поведение, но в действительности переменная имеет непредсказуемое значение, которое передается в printf, которую printf затем интерпретирует как unsigned. Я предполагаю, что изначальная проблема bodacydo заключалась в том, что поток достиг неверного вызова printf вместо того, который предполагался ...
R .. GitHub ОСТАНОВИТЬ ПОМОЩЬ ICE

8
@Anisha Kaul:% lu является допустимой спецификацией преобразования,% ul - нет. %lu, разбито это: %- запускает «спецификацию преобразования»; l- модификатор длины, lозначает «[unsigned] long int»; u- спецификатор преобразования uдля unsigned intраспечатки в десятичном виде. Поскольку мы дали модификатор длины l, он принимает unsigned long int. Буквы должны быть в таком порядке: проценты, длина, конверсия. (Есть еще несколько опций, таких как ширина и точность, которые вы можете добавить. Смотрите справочную страницу , так как она точно документирует все это!)
Thanatos

1
% ul просто напечатает без знака (с% u), а затем дословно букву "l". Так же, как «% uw» будет печатать без знака, за которым следует буква «w». % запускает конспекцию, u (или другой символ, например d, s, c ...) заканчивает его.
Veky

30
  • %luдля неподписанного долго
  • %lluдля неподписанного

13
Соглашение Йоды: "unsigned long" "(l) ong (u) nsigned" is.
Reb.Cabin

28

Для инт %d

Для долгого времени %ld

Для долгого долгого междунар %lld

Для неподписанных long long int %llu


23

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


1
% ld будет работать нормально до значения std :: numeric_limits <unsigned long> :: max () / 2. Выше этого% ld будет напечатано неправильное значение (отрицательное значение).
Каушик Ачарья

1
@KaushikAcharya: Нет, выше, это UB. И это, возможно, даже UB до этого, поскольку printfопределено, что он требует точных правильных типов аргументов без допусков, которые va_argмогли бы иметь.
R .. GitHub ОСТАНОВИТЬСЯ, ПОМОГАЯ ЛЬДОМ


9

Формат есть %lu.

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


2
Там описано различное нестандартное поведение, не помечая его как нестандартное. POSIX - самый простой доступный онлайн-стандарт для printf; расширения, превышающие ISO C, помечены тегом «CX»: opengroup.org/onlinepubs/9699919799/functions/fprintf.html
R .. GitHub ОСТАНОВИТЬ ПОМОЩЬ ICE

8

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

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

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


-5

У меня такая же проблема. Попробуйте "% ul", у меня это работает.


6
На этот вопрос ответили более 8 лет назад. Пожалуйста, убедитесь, что новый ответ добавляет новую информацию, и что более важно, даже правильно.
Герхард
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.