Как печатать значения uint32_t и uint16_t?
Я пытаюсь напечатать значения uint16_t и uint32_t, но не дает желаемого o/p.
#include<stdio.h>
#include <netinet/in.h>
int main()
{
uint32_t a=12,a1;
uint16_t b=1,b1;
a1=htonl(a);
printf("%d---------%d",a1);
b1=htons(b);
printf("\n%d-----%d",b,b1);
return 0;
}
Я также использовал
printf("%"PRIu32, a);
который показывает ошибку.
Как напечатать это значение и что будет нужным o/p
Ответы
Ответ 1
Вам нужно включить inttypes.h
, если вы хотите, чтобы все эти отличные новые спецификаторы формата для типов intN_t
и их братья, и это правильный (то есть переносимый) способ сделать это, если ваш компилятор соответствует C99, Вы не должны использовать стандартные, такие как %d
или %u
, если размеры отличаются от того, что вы думаете.
Он включает в себя stdint.h
и расширяет его с помощью довольно многих других вещей, таких как макросы, которые могут использоваться для семейства вызовов printf/scanf
. Это описано в разделе 7.8 стандарта ISO C99.
Например, следующая программа:
#include <stdio.h>
#include <inttypes.h>
int main (void) {
uint32_t a=1234;
uint16_t b=5678;
printf("%" PRIu32 "\n",a);
printf("%" PRIu16 "\n",b);
return 0;
}
выходы:
1234
5678
Ответ 2
Макросы, определенные в <inttypes.h>
, являются наиболее правильным способом печати значений типов uint32_t
, uint16_t
и т.д. - но это не единственный способ.
Лично я считаю, что эти макросы трудно запомнить и неловко использовать. (Учитывая синтаксис строки формата printf
, которая, вероятно, неизбежна, я не утверждаю, что могла придумать лучшую систему.)
Альтернативой является передача значений в предопределенный тип и использование формата для этого типа.
Типы int
и unsigned int
гарантируются языком шириной не менее 16 бит и, следовательно, иметь возможность удерживать любое преобразованное значение типа int16_t
или uint16_t
соответственно. Аналогично, long
и unsigned long
имеют ширину не менее 32 бит, а long long
и unsigned long long
имеют ширину не менее 64 бит.
Например, я мог бы написать вашу программу следующим образом (с несколькими дополнительными настройками):
#include <stdio.h>
#include <stdint.h>
#include <netinet/in.h>
int main(void)
{
uint32_t a=12, a1;
uint16_t b=1, b1;
a1 = htonl(a);
printf("%lu---------%lu\n", (unsigned long)a, (unsigned long)a1);
b1 = htons(b);
printf("%u-----%u\n", (unsigned)b, (unsigned)b1);
return 0;
}
Одним из преимуществ этого подхода является то, что он может работать даже с реализациями до C99, которые не поддерживают <inttypes.h>
. Такая реализация, скорее всего, не имела бы <stdint.h>
, но метод полезен для других целочисленных типов.
Ответ 3
В моем случае я просто использую %u
для вывода значения с типом uint32_t. Он работает.
например.
uint32_t i = 31 - __builtin_clz(mask);
D("read i= %u ", __FUNCTION__, i);