Як надрукувати "C без подписа" на 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працювали цього разу. Дякую. Мабуть, щось і раніше було, і це не спрацювало.
bodacydo

1
@bodacydo: Якщо у вас помилка, вона може з’явитися напіввипадковою ... переконайтеся, що ваша змінна має дійсне значення, перш ніж спробувати її надрукувати.
Танатос

1
Навіть якщо змінна неініціалізована, не повинно бути шляху printf до точки, де вона могла б надрукувати знак мінус, коли був специфікатор формату %lu. Технічно це невизначена поведінка, але насправді змінна має непередбачуване значення, яке передається printf, який printf потім інтерпретує як непідписаний. Я здогадуюсь, що первісною проблемою bodacydo був потік, що досягав невірного виклику printf замість призначеного ...
R .. GitHub ЗАСТОСУЙТЕ ДОПОМОГА ДВІ

8
@Anisha Kaul:% lu - це дійсна специфікація перетворення,% ul - ні. %lu, розбитий: %- запускає "специфікацію перетворення"; l- модифікатор довжини, lозначає "[неподписаний] довгий int"; u- специфікатор перетворення uдля unsigned intдрукується у вигляді десяткової форми. Оскільки ми дали модифікатор довжини l, він приймає значення "an" unsigned long int. Букви повинні бути в такому порядку: відсотки, довжина, конверсія. (Є ще кілька варіантів, таких як ширина та точність, які ви можете додати. Дивіться сторінку чоловіка , оскільки це все документує точно!)
Танатос,

1
% ul буде просто друкувати без підпису (з% u), а потім буква "l" дослівно. Так само, як "% uw" друкуватиме без підпису, а потім напись "w". % починає convspec, u (або якийсь інший символ, наприклад d, s, c ...) закінчується ним.
Векі

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

13
Конвенція Yoda: "без підпису довго" "(l) ong (u) nsigned" є.
Reb.Cabin

28

Для міжнар %d

Для тривалого міжнар %ld

Для довгого довгого міжнар %lld

Для неподписаних довгих довгих int %llu


23

З усіх комбінацій, які ви пробували, %ldі %luє єдиними, які взагалі є дійсними специфікаторами формату printf. %lu(довгий неподписаний десятковий), %lxабо %lX(довгий шістнадцятковий з малої чи великої літери) та %lo(довгий восьмеричний) - єдині дійсні специфікатори формату для змінної типу без підпису довгий (звичайно, ви можете додавати модифікатори ширини поля, точності тощо) %і l).


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

1
@KaushikAcharya: Ні, вище, ніж UB. І це, мабуть, навіть UB до цього, оскільки printfвказано, щоб вимагати точні правильні типи аргументів без припущень, які va_argбули б.
R .. GitHub СТОП ДОПОМОГАТИ ICE


9

Формат є %lu.

Будь ласка, ознайомтеся з різними іншими типами даних та їх використанням у printf тут


2
Різні нестандартні поведінки зафіксовані там, не позначаючи його як нестандартне. POSIX - це найпростіший доступ до Інтернету для стандарту printf; розширення за межами ISO C позначені тегом "CX": opengroup.org/onlinepubs/9699919799/functions/fprintf.html
R .. GitHub STOP HELPING ICE

8

Правильний специфікатор для ненаписаних довгих є %lu.

Якщо ви не отримуєте точне значення, яке ви очікуєте, то у вашому коді можуть виникнути проблеми.

Скопіюйте тут свій код. Тоді, можливо, хтось може вам краще сказати, в чому проблема.


-5

У мене була така ж проблема. Спробуйте "% ul", він працює для мене.


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