At a Glance
8-bit unsigned: 0 .. 255
8-bit signed two's complement: -128 .. 127
value 0x12345678
big-endian bytes: 12 34 56 78
little-endian bytes: 78 56 34 12Endianness는 여러 byte로 된 값을 메모리나 스트림에 어떤 순서로 놓는지의 규칙입니다. 숫자의 수학적 값 자체가 바뀌는 것이 아니라 byte 배열을 해석하는 규약이 달라집니다.
정수 경계
고정 폭 unsigned 정수는 n bit에서 0부터 2^n - 1까지 표현합니다. signed 정수 범위와 표현은 언어와 표준의 조건을 확인해야 하며, 현대 환경에서는 2의 보수가 널리 사용됩니다.
signed와 unsigned를 섞어 비교하면 예상과 다른 변환이 생길 수 있습니다. 크기나 파일 형식처럼 음수가 없는 값에도 무조건 unsigned가 최선인 것은 아닙니다. API 계약과 산술 경계를 먼저 정합니다.
Byte Order
네트워크 프로토콜과 파일 형식은 byte order를 명시해야 서로 다른 시스템이 같은 값을 읽습니다. 프로토콜이 big-endian을 요구하면 호스트가 little-endian인지와 관계없이 전송 전에 해당 순서로 직렬화합니다.
write_u32_be(value): 가장 높은 8 bits부터 기록
read_u32_be(bytes): byte 순서를 규약대로 조합구조체 메모리를 통째로 파일이나 네트워크에 보내면 endianness뿐 아니라 padding, 정렬, compiler ABI 차이까지 노출됩니다. 필드를 명시적으로 직렬화하는 방식이 기본입니다.
자주 틀리는 점
- bit 수와 byte 수를 섞지 않습니다. 32 bits는 4 bytes입니다.
- overflow 동작을 모든 언어에서 같다고 가정하지 않습니다.
- 문자열로 보이는 16진수 표기 순서와 실제 메모리 byte 순서를 구분합니다.
- native 구조체 layout을 영구 파일 형식으로 사용하지 않습니다.
참고 링크
2 sources