저는 대학에 대한 에세이를하고 혼란에 빠졌습니다. 16 진수 값을 문자열로 사용 C
int main(void) {
unsigned int i = 0x00646c72;
printf("H%x Wo%s\n", 57616, (char *) &i);
}
기본적으로이 arquitecture 조금 엔디안에서 출력합니다 : He110 세계
을 나는이 코드 조각은 빅 엔디안의 arquitecture하여 인쇄 실행 된 것입니다 경우 어떻게 말해야한다.
지금까지 내가 알고 : 그들이 때문에 8 비트 표현 문자열 리터럴가되는 곳'H'를, 공간, 'W'와 'O'는 남아있을 것입니다.
16 진수의 값 57616은 e110입니다. 이것은 내 지식에 10e1로 리틀 엔디안에 저장해야하지만 여전히 'e110'으로 인쇄됩니다. 어쩌면 % x 포맷터의 작동 방식과 관련이 있을까요?
0x00646c72는 'dlr'로 ASCII로 변환되므로 little endian에서는 'rld'를 읽지 만 Big Endian에서는 'dlr'이 인쇄됩니다. 이 asumptions가 맞습니까? 마지막으로 매우 관련 문제
은 :
#define VGABUF ((void *) 0xb8000)
void begin(void) {
int *vga = VGABUF;
*vga = 0x2f4b2f4f;
while (1)
continue;
}
나는 빅 엔디안의 arquitecture 정확히 동일하게 동작하는 (녹색 배경에 확인 기호를 표시)이 코드를 수정하도록 요청하고있다. 문자열 리터럴로 vga를 작성해야한다고 생각하지만 시도해 보았지만 아무 것도 인쇄하지 않았습니다.
입니다. 57616의 경우 크고 작음이 중요하지 않습니다. 다른 결과가 나온다면 컴파일러의 버그 일 수 있습니다. 두 번째 숫자는 32 비트 값을 취해 그 기본 주소를 문자열로 가리 킵니다. 리틀 엔디안에서는 기본 주소가 최하위 바이트의 주소이기도합니다. 빅 엔디안은 다른 변형을 가지고 있지만, 값의 기본 주소가 msbyte의 주소라는 것을 의미한다고 가정하면 그 번호를 순차적으로 따라 가면서 문자열로 처리해야합니다. –
@old_timer 예, 정확하게. 문자열로 처리되는 숫자에서 각 바이트를 탐색하면 무엇을 얻게됩니까? 그래서 Big Endian에서 dlr을 인쇄 할 것이라고 생각합니다. 그리고 여러분은 57616에 대해 감사합니다. – Franch
리틀 엔디안이 0x72, 0x6c, 0x64, 0x00 순서로 해당 바이트를 처리한다고 알려주는 경우그렇다면 빅 엔디안은 0x00, 0x64, 0x6C, 0x72가 될 것입니다. 두 경우 모두 ASCII 문자열이 C로 어떻게 끝나는 지 이해하고 있습니까? –