본문 바로가기
프로그래밍/C

C ] 빅엔디안 리틀엔디안 변환함수 구현 + 매크로 함수 작성시 주의점

by eteo 2022. 10. 22.

htons(), htonl(), ntohs(), ntohl() 함수를 쓰지 않고 직접 구현하기

 

#include <iostream>
#define uint16_t    unsigned short
#define uint32_t    unsigned int
#define SWAP_UINT16(x) ((uint16_t)((((x) & 0xff00) >> 8) | (((x) & 0x00ff) << 8)))
#define SWAP_UINT32(x) ((uint32_t) ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)))
// 혹은 + 연산자 사용
//#define swap16(x) ((uint16_t)((((x) >> 8) & 0x00ff) + (((x) & 0x00ff) << 8)))

using namespace std;

int main()
{
    uint16_t n = 0xaa14;
    cout<<hex<<swap16(n)<<endl;
    cout<<swap16(swap16(n))<<endl;
    
    uint32_t num = 0x12345678;
    cout<<swap32(num)<<endl;
    cout<<swap32(swap32(num))<<endl;

    return 0;
}

 

 

 

매크로 함수는 함수처럼 사용할 수 있지만 단순 치환만 하기 때문에 일반 함수와 같이 사용하면 예상과 다른 결과가 나올 수 있다. 따라서 다음의 주의가 필요하다.

 

매크로 함수 작성시 주의할 점

  • 매크로 함수의 전체를 괄호(())로 감싸야 한다.
  • 매크로 함수의 인수들도 각각 괄호로 감싸야 한다.
  • 매크로 함수를 호출할 때 증감연산자 ++, -- 나 복합 대입 연산자 +=, -= 등은 사용하지 않는 것이 좋다.

 

#include <stdio.h>
#define SQR(X) ((X)*(X))
#define PRT(a,b) printf("%d의 제곱은 %d입니다.\n", a,b)  

int main(void)
{

    int result;
    int x;  
    
    scanf("%d", &x);

    result = SQR(x);
    PRT(x, result);

    return 0;

}