엔디안
엔디안이란?(Endianness)
더보기

: 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상(Byte)가 저장되는 순서(Byte order)

CPU에 따라서 바이트의 숫자를 메모리 공간에 저장하는 방식에 있어 차이가 있습니다.
이해하기 쉽게 32비트 CPU란 가정하에 간략한 예를 들어보겠습니다.
숫자 1을 저장 할 때, 앞에서 부터 저장할 것인지, 뒤에서 부터 자장할 것인지 순서가 다릅니다.
# 숫자 1 저장 예시 1
00000000 00000000 00000000 00000001
# 숫자 1 저장 예시 2
00000001 00000000 00000000 00000000
메모리와 메모리 주소
더보기


- 데이터 최소 단위
- 1bit
- 컴퓨터 메모리의 데이터 최소 저장 단위
- 1Byte(8bit)
- 1bit를 저장해도 1byte 공간 단위를 사용하여 그 중 1bit만 저장한다.
- 컴퓨터의 데이터 최소 처리 단위는 32bit (4Byte), 64bit (8Byte)이다.
즉, 한번에 32bit(4Byte), 8개 64bit(8Byte)를 저장하고 처리 한다. - 32bit(4Byte, 16진수 8개) 운영체제의 경우
- 4,294,967,296(4GB) 개의 1Byte 단위로 메모리 주소값 가진다.
MSB, LSB
더보기

십진수 439041101 = 16진수 0x1a2b3c4d = 2진수 00011010001010110011110001001101

16진수 0x1a2b3c4d = 십진수 439041101 = 2진수 00011010001010110011110001001101
- 2진수에서 가장 큰 자리수 = 첫번째 자리수 = 첫번째 8bit
- 2진수 00011010
- 16진수 1A
- 2진수에서 가장 작은 자리수 = 마지막 자리수 = 네번째 8bit
- 2진수 01001101
- 16진수 4D
MSB(Most Significant Bit): 2진수(bit)의 가장 큰 자릿수
LSB(Least Significant Bit): 2진수(bit)의 가장 작은 자릿수
MSB와 LSB는 데이터를 비트(Bit) 단위로 놓고 봤을 때 사용되는 용어
Significant의 의미는, 해당 비트가 숫자 값의 크기에 얼마나 큰 영향을 미치는지를 나타냄
Big-Endian vs Little-Endian
더보기




Big-Endian
- 사람이 읽는 순서와 메모리 배열이 일치
- 가장 낮은 메모리 주소부터, 저장될 값의 첫번째 1byte(MSB)가 저장되는 방식
- “가장 중요한 부분을 먼저” 처리한다
- “나라” → “시/도” → “구/군” → “도로명” 순서로 작성하는 방식
- 첫 바이트만 봐도 중요한 정보를 바로 파악
- “첫 바이트가 곧 상위 8비트”임을 직관적으로 알 수 있어 코드가 간결합니다.
- 첫 2바이트만 읽으면 전체 페이로드 크기를 알 수 있고, 바로 다음 바이트로 메시지 타입을 읽을 수 있습니다
- 네트워크와 같이 bit 단위의 연산을 기본으로 한다면, 대부분 Big Endian 방식
등의 장점이 있어, 특히 네트워크 프로토콜 구현·디버깅·대용량 데이터 검색 등에서 편리하게 활용됩니다.
Little-Endian
- 2025-07-15 → 2025-07-16 으로 날짜를 바꿀 때
- 연(YYYY) → 월(MM) → 일(DD) 순서에서, 맨 끝 “일” 필드만 찾아가서 15→16으로 수정
- 가장 작은 단위(일)가 앞쪽(메모리 상 낮은 주소)에 있으면” 원하는 부분만 곧바로 찾아서 변경
- 저장할 데이터를 2진수로 본다면, 저장값의 마지막 1byte(LSB)가 가장 낮은 메모리 주소에 먼저 저장되는 방식
- 대부분의 인텔 CPU 계열에서 사용
- 수학 덧셈의 올림(carry) 처리
- 29 + 1 을 구할 때, “9 + 1 = 10” → 일의 자리부터 계산하고
올림을 다음 자리(십의 자리)로 전파, “2 + 0(올림) = 3”
→ 결과 30 - 0x1234 + 0x5678 덧셈 올림을 한다면
- 29 + 1 을 구할 때, “9 + 1 = 10” → 일의 자리부터 계산하고
0x1234
+ 0x5678
저장은 34 12
+78 56
연산도 0x34
+ 0x78 부터 시작
- 0x12345678 >> 0x123456AB 변경 예시
#include <stdio.h>
#include <stdint.h>
int main() {
uint32_t value = 0x12345678;
uint8_t *p = (uint8_t*)&value;
// 리틀 엔디안: p[0]이 가장 작은 자리(0x78)를 가리킴
printf("원래 LSB: 0x%02X\n", p[0]);
// LSB만 0xAB로 변경
p[0] = 0xAB;
printf("변경된 값: 0x%08X\n", value); // 0x123456AB
return 0;
}
Big-Endian vs Little-Endian 비교
: Big-Endian 방식은, 숫자 비교와 디버깅이 쉽고, Little-Endian 방식은, 연산과 형변환이 쉽다
