메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Endianness: 두 판 사이의 차이

noriwiki
Pinkgo (토론 | 기여)
편집 요약 없음
Pinkgo (토론 | 기여)
편집 요약 없음
 
39번째 줄: 39번째 줄:
0x7ffd0f231867:  0x00
0x7ffd0f231867:  0x00
</syntaxhighlight>
</syntaxhighlight>
303030을 16진수로 나타내면 0x49fb6인데, 실행결과에서 0x04가 highest address에 저장된 것으로 보아 정상적인 little endian 방식으로 저장되었다.
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 방식이 나뉜다.

파일:Endianness.png

  • 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));
}

위를 실행하면 결과는 다음과 같이 나온다.

파일:EndianExample.png
stroing 303030 in little endian.
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단위로 정보를 저장하기 때문이다.

각주

  1. ASCII code에서 0에 해당한다.