Как напечатать «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что у меня есть.

bodacydo
источник

Ответы:

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для неподписанного
NealCaffery
источник
13
Соглашение Йоды: "unsigned long" "(l) ong (u) nsigned" is.
Reb.Cabin
28

Для инт %d

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

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

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

Linkon
источник
23

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

R .. GitHub СТОП, ПОМОГАЯ ЛЬДУ
источник
1
% ld будет работать нормально до значения std :: numeric_limits <unsigned long> :: max () / 2. Выше этого% ld будет напечатано неправильное значение (отрицательное значение).
Каушик Ачарья
1
@KaushikAcharya: Нет, выше, это UB. И это, возможно, даже UB до этого, поскольку printfопределено, что он требует точных правильных типов аргументов без допусков, которые va_argмогли бы иметь.
R .. GitHub ОСТАНОВИТЬСЯ, ПОМОГАЯ ЛЬДОМ
9
int main()
{
    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();
}

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

Санджит Браво Дастан
источник
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", у меня это работает.

Joseleo
источник
6
На этот вопрос ответили более 8 лет назад. Пожалуйста, убедитесь, что новый ответ добавляет новую информацию, и что более важно, даже правильно.
Герхард