다른 명령
새 문서: 상위 문서: Memory ==개요== ==각주== 분류:컴퓨터 시스템 |
편집 요약 없음 |
||
| (같은 사용자의 중간 판 하나는 보이지 않습니다) | |||
| 2번째 줄: | 2번째 줄: | ||
==개요== | ==개요== | ||
multi-byte data를 메모리에 어떠한 방식으로 저장하는 지를 byte ordering이라고 하며, 대표적으로 두가지 방식이 주로 사용된다. | |||
** Big Endian: Sun, PowerPC | |||
** Little Endian: x86-64, ARM* | |||
==Byte Ordering== | |||
만약 C code에 int x = 0x12345678을 저장하고자 한다면, 0x12(MSB)가 어디에 저장되느냐에 따라서 byte ordering 방식이 나뉜다. | |||
[[파일:Endianness.png|프레임없음|500x500픽셀]] | |||
* Big Endian: MSB(0x12)를 lowest address에 저장한다. | |||
** 즉, x는 0x12, 0x34, 0x56, 0x78과 같이 byte단위로 쪼개어져서 저장된다. | |||
* Little Endian: MSB(0x12)를 highest address에 저장한다. | |||
** 즉, x는 0x78, 0x56, 0x34, 0x12과 같이 byte단위로 쪼개어져서 저장된다. byte8개에는 16진수가 2자릿수까지 저장되기 때문이다. | |||
===Checking Byte Order=== | |||
아래는 data의 byte 표현을 알아보는 c 함수이다. | |||
<syntaxhighlight lang="c"> | |||
void show_bytes(unsigned char* start, size_t len) { | |||
size_t i; | |||
for (i = 0; i < len; i++) { | |||
printf("%p: 0x%.2x\n", start + i, start[i]); | |||
} | |||
} | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="c"> | |||
int main() { | |||
int a = 303030; | |||
show_byte((unsigned char*) &a, sizeof(int)); | |||
} | |||
</syntaxhighlight> | |||
위를 실행하면 결과는 다음과 같이 나온다. | |||
[[파일:EndianExample.png|섬네일|stroing 303030 in little endian.]] | |||
<syntaxhighlight lang="shell"> | |||
0x7ffd0f231864: 0xb6 | |||
0x7ffd0f231865: 0x9f | |||
0x7ffd0f231866: 0x04 | |||
0x7ffd0f231867: 0x00 | |||
</syntaxhighlight> | |||
303030을 16진수로 나타내면 0x49fb6인데, 실행결과에서 0x04가 highest address에 저장된 것으로 보아 정상적인 little endian 방식으로 저장되었다. a의 자료형이 pointer이더라도 pointer도 결국은 컴퓨터의 관점에서는 정수이므로 그 결과는 크게 다르지 않다. | |||
===String Representaion in Memory=== | |||
C에서 String은 character의 배열로 표현된다. 각각의 character는 ASCII code로 encode되며, 1byte의 크기를 가진다. | |||
또한 String은 null 자료형으로<ref>ASCII code에서 0에 해당한다.</ref> 종료되어야 한다. 이러한 특징을 갖는 string "AB123"을 앞선 함수에 인자로 전달하면 다음과 같이 출력된다. | |||
<syntaxhighlight lang="shell"> | |||
0x7ffd0f231872: 0x41 | |||
0x7ffd0f231873: 0x42 | |||
0x7ffd0f231874: 0x31 | |||
0x7ffd0f231875: 0x32 | |||
0x7ffd0f231876: 0x33 | |||
0x7ffd0f231877: 0x00 | |||
</syntaxhighlight> | |||
이를 위에서 부터 순서대로 ASCII code에 대해 decoding하면 A, B, 1, 2, 3, null로 해석된다. 이를 통해서 string 자료형의 저장되는 중요한 특징을 알 수 있는데, big endian이던, little endian이던 byteordering에는 영향을 주지 못한다는 것이다. 그 이유는 String이 1개의 byte단위로 정보를 저장하기 때문이다. | |||
==각주== | ==각주== | ||
[[분류:컴퓨터 시스템]] | [[분류:컴퓨터 시스템]] | ||
2025년 3월 20일 (목) 00:35 기준 최신판
상위 문서: Memory
개요
multi-byte data를 메모리에 어떠한 방식으로 저장하는 지를 byte ordering이라고 하며, 대표적으로 두가지 방식이 주로 사용된다.
- Big Endian: Sun, PowerPC
- Little Endian: x86-64, ARM*
Byte Ordering
만약 C code에 int x = 0x12345678을 저장하고자 한다면, 0x12(MSB)가 어디에 저장되느냐에 따라서 byte ordering 방식이 나뉜다.
- Big Endian: MSB(0x12)를 lowest address에 저장한다.
- 즉, x는 0x12, 0x34, 0x56, 0x78과 같이 byte단위로 쪼개어져서 저장된다.
- Little Endian: MSB(0x12)를 highest address에 저장한다.
- 즉, x는 0x78, 0x56, 0x34, 0x12과 같이 byte단위로 쪼개어져서 저장된다. byte8개에는 16진수가 2자릿수까지 저장되기 때문이다.
Checking Byte Order
아래는 data의 byte 표현을 알아보는 c 함수이다.
void show_bytes(unsigned char* start, size_t len) {
size_t i;
for (i = 0; i < len; i++) {
printf("%p: 0x%.2x\n", start + i, start[i]);
}
}
int main() {
int a = 303030;
show_byte((unsigned char*) &a, sizeof(int));
}
위를 실행하면 결과는 다음과 같이 나온다.
0x7ffd0f231864: 0xb6
0x7ffd0f231865: 0x9f
0x7ffd0f231866: 0x04
0x7ffd0f231867: 0x00
303030을 16진수로 나타내면 0x49fb6인데, 실행결과에서 0x04가 highest address에 저장된 것으로 보아 정상적인 little endian 방식으로 저장되었다. a의 자료형이 pointer이더라도 pointer도 결국은 컴퓨터의 관점에서는 정수이므로 그 결과는 크게 다르지 않다.
String Representaion in Memory
C에서 String은 character의 배열로 표현된다. 각각의 character는 ASCII code로 encode되며, 1byte의 크기를 가진다. 또한 String은 null 자료형으로[1] 종료되어야 한다. 이러한 특징을 갖는 string "AB123"을 앞선 함수에 인자로 전달하면 다음과 같이 출력된다.
0x7ffd0f231872: 0x41
0x7ffd0f231873: 0x42
0x7ffd0f231874: 0x31
0x7ffd0f231875: 0x32
0x7ffd0f231876: 0x33
0x7ffd0f231877: 0x00
이를 위에서 부터 순서대로 ASCII code에 대해 decoding하면 A, B, 1, 2, 3, null로 해석된다. 이를 통해서 string 자료형의 저장되는 중요한 특징을 알 수 있는데, big endian이던, little endian이던 byteordering에는 영향을 주지 못한다는 것이다. 그 이유는 String이 1개의 byte단위로 정보를 저장하기 때문이다.
각주
- ↑ ASCII code에서 0에 해당한다.