Programming/C
[C] 1byte씩 읽는 포인터, 리틀 엔디안, 빅 엔디안
scii
2020. 6. 9. 18:01
// 총 4바이트
0x12345678
빅 엔디안
- 리눅스, 유닉스 등은 빅 엔디안 방식이다. 큰 수의 비트부터 읽어 들이고 메모리에 저장할 때도 마찬가지로 큰 비트를 먼저 메모리에 올린다.
즉, 위의 16진수 같은 값이 있다면 0xAAA1 주소에 0x12가 올라가고 그 다음 0xAAA2 주소에 0x34 값이 올라가고 그 다음 0XAAA3 주소에 0x56 값이 올라가고 마지막 0x78은 0xAAA4 주소에 올라간다.
0xAAA4 |
0x78 |
0xAAA3 |
0x56 |
0xAAA2 |
0x34 |
0xAAA1 |
0x12 |
위의 표 처럼 메모리에 올라간다.
리틀 엔디안
- 윈도우즈는 리틀 엔디안 방식이다. 작은 수의 비트부터 읽어 들이고 메모리에 저장할 때도 마찬가지로 작은 비트를 먼저 메모리에 올린다.
0xAAA4 |
0x12 |
0xAAA3 |
0x34 |
0xAAA2 |
0x56 |
0xAAA1 |
0x78 |
이렇게 운영체제마다 달라서 네트워크로 데이터를 전송 시, 유의해야 한다.
1Byte씩 읽어 들이는 포인터 연산 예제
int main(void){
int data = 0x12345678;
// char형 포인터이므로 data의 주소 값도 char 포인터 형으로 변환
char* ptr = (char*)&data;
for(int i=0; i<4; i++){
printf("%x, %d \n", *ptr, *ptr);
// 포인터 연산. char형 이므로 1바이트씩 건너뛴다.
ptr++;
}
return 0;
}
/* 결과
78, 120
56, 86
34, 52
12, 18
*/
windows 시스템에서 실행, 리틀 엔디안 방식이므로 위의 결과 처럼 나왔다.