big and little-endianness을 공부하고 있습니다.엔디안에 관한 C 코드를 이해하려면
1. 다음 코드에서 | \
의 목적은 무엇입니까?
...
#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
#define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
(((uint16_t)(A) & 0x00ff) << 8))
...
2. 코드 (A)
의 목적은 무엇인가?
답장을 보내 주셔서 감사합니다. –
마스크 & 0xff00 또는 & 0x00ff가 필요하지 않습니다. 첫 번째 경우에는 맨 아래 8 비트가 맨 아래로 이동하기 때문에 마스크됩니다. 두 번째 경우에는 비트가 오버플로되고 손실됩니다. (uint16_t) ((uint16_t) (A) >> 8)) ((uint16_t) (A) << 8)))은 동일한 결과를 나타냅니다. –
@Tom Leys는 두 번째 경우에 대해 동의하지 않습니다. '(((uint16_t) (A)) << 8))'. 'A'는 16 비트의 LS 비트를 유지하는'uint16_t'에 캐스트됩니다. 그런 다음 일반적인 정수 프로모션을 생각해 봅니다. 예를 들어 32 비트 'int'가 될 수 있습니다. 그런 다음 그 값이 바뀝니다 8. OP가 원하는 것 같지는 않습니다. – chux