programing

uint32_t 및 uint16_t 변수' 값을 인쇄하려면 어떻게 해야 합니까?

goodsources 2022. 7. 10. 21:25
반응형

uint32_t 및 uint16_t 변수' 값을 인쇄하려면 어떻게 해야 합니까?

uint16_t 및 uint32_t 값을 인쇄하려고 하는데 원하는 출력이 나오지 않습니다.

#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);

에러를 나타내고 있습니다.

이러한 값을 인쇄하려면 어떻게 해야 하며 원하는 출력은 무엇입니까?

다음을 포함해야 합니다.inttypes.h이 모든 새로운 포맷 지정자를 원하는 경우intN_t컴파일러가 C99에 준거하고 있는 경우, 올바른 (휴대용) 방법이라고 생각됩니다.이런 거 쓰면 안 돼요%d또는%u만약 당신이 생각하는 것과 사이즈가 다를 경우.

다음을 포함합니다.stdint.h다른 많은 것들과 함께 확장합니다.예를 들어, 이 매크로를 사용하여printf/scanf콜 패밀리이는 ISO C99 표준의 섹션 7.8에서 다룹니다.

예를 들어 다음과 같은 프로그램이 있습니다.

#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

에서 정의된 매크로<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>어느 쪽이든 상관없습니다만, 이 기술은 다른 정수 타입에 도움이 됩니다.

언급URL : https://stackoverflow.com/questions/12120426/how-do-i-print-uint32-t-and-uint16-t-variables-value

반응형