문제

나는 이것을 시도했다

char c[4];
int i=89;
memcpy(&c[0],&i,4);
cout<<(int)c[0]<<endl;
cout<<(int)c[1]<<endl;
cout<<(int)c[2]<<endl;
cout<<(int)c[3]<<endl;

출력은 다음과 같습니다.
89
0
0
0

어떤 예쁜 훈련을 내 Stomache cuz를 훈련시키는 지 숫자가 0x00000059와 같이 메모리에 저장 될 것이라고 생각 했으므로 C [0]은 어떻게 89입니까? 나는 그것이 C [3]에 있어야한다고 생각했다.

도움이 되었습니까?

해결책

실행중인 프로세서는 IS입니다 리틀 엔디언. 다중 바이트 기본 유형의 바이트 순서가 교체됩니다. 빅 엔디안 기계에서는 예상대로 될 것입니다.

다른 팁

이것은 당신이 a에서 프로그램을 운영하고 있기 때문입니다 작은 엔디언 CPU. 엔디 니스를 참조하십시오 여기 그리고 거기.

Goz가 지적한 것처럼 Endian-은 분명히 대답입니다.

그러나 그것이 무엇을 의미하는지 불분명 한 사람들에게는 예제에 표시된 바이트의 순서가 원래 int의 순서와 동일하다는 것을 이해하는 것도 중요합니다. Memcpy는 에디안 유형의 플랫폼에 관계없이 바이트 순서를 변경하지 않습니다.

바이트 순서는 임의의 설계 결정이기 때문입니다. 레지스터에 들어가면 바이트 주문이 없습니다.1.

바이트 순서는 바이트와 같은 작은 장치를 다룰 때 발생합니다. CPU 디자이너가 빅 엔디안 또는 리틀 엔디언을내는 것은 본질적으로 임의의 결정입니다.

상황을 단순화하고 주로 바이트 순서대로 주변 장치와 연결되어 있음을 인식하는 것이 유용합니다. 예, 입증 된대로 바이트 주소를 통해 발견 할 수 있지만 일반적으로 스칼라 값이로드되어 단위로, 레지스터에 저장 되며이 경우 바이트 순서는 아무것도 변경하지 않습니다. 가장 중요한 비트는 "왼쪽"에 있습니다. 적어도 우리는 일반적으로 숫자를 쓰는 방식입니다. 그리고 그것이 이유입니다 << 그리고 >> 운영자는 언어 표준에 따라 사용될 때 항상 빅 엔디 언 대 리틀 엔디안 머신에서 정확히 동일한 결과를 생성합니다.

그러나 주변 장치에 데이터 스트림을 읽고 작성하려면 바이트 순서를 선택해야합니다. 주변 장치는 근본적으로 바이트 스트림 장치이기 때문입니다. 가장 낮은 주소는 가장 중요한 비트를 가지고 있습니까? 그것은 두 가지 방법으로 모두 끝났고 캠프는 다소 고르게 분열되었습니다.

메모리 자체가 바이트가 해결되기 때문에 주변 장치없이 다른 동작을 도출 할 수는 있지만, 이것은 일반적으로 당신이했던 것처럼 의도적 인 엿보기 없이는 발생하지 않습니다.

바이트가없는 CPU, 32 비트 단어 만 0, 1, 2로 다루고 있다고 상상해보십시오. (이것은 CX9에 의해 허용됩니다.) 와우, 바이트 주문 문제는 없습니다! 둘 다! 그러나 .. 첫 주변 장치를 연결하면 어떻게됩니까?


1.글쎄, x86에는 별명이 작은 레지스터가있는 레지스터가 있지만 또 다른 이야기입니다.

다른 기계는 다른 바이트 순서를 가질 수 있지만 바이트가 어떻게 배치되는지에 따라이 코드를 살펴보고 다음과 같이 생각합니다.

long x = 89;
short *p = (short*)&x;
short y = *p;

애플리케이션이 팀 내에서 휴대용 또는 개발되기를 원한다면이 논리를 따르고 싶지 않을 것입니다. 버그를 포착하고 개발을 연장하기가 어렵 기 때문에이 논리를 따르고 싶지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top