Подтвердить что ты не робот

Как печатать значения 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

4b9b3361

Ответ 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);