2017-03-16 2 views
0

저는 대학에 대한 에세이를하고 혼란에 빠졌습니다. 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를 작성해야한다고 생각하지만 시도해 보았지만 아무 것도 인쇄하지 않았습니다.

+1

입니다. 57616의 경우 크고 작음이 중요하지 않습니다. 다른 결과가 나온다면 컴파일러의 버그 일 수 있습니다. 두 번째 숫자는 32 비트 값을 취해 그 기본 주소를 문자열로 가리 킵니다. 리틀 엔디안에서는 기본 주소가 최하위 바이트의 주소이기도합니다. 빅 엔디안은 다른 변형을 가지고 있지만, 값의 기본 주소가 msbyte의 주소라는 것을 의미한다고 가정하면 그 번호를 순차적으로 따라 가면서 문자열로 처리해야합니다. –

+0

@old_timer 예, 정확하게. 문자열로 처리되는 숫자에서 각 바이트를 탐색하면 무엇을 얻게됩니까? 그래서 Big Endian에서 dlr을 인쇄 할 것이라고 생각합니다. 그리고 여러분은 57616에 대해 감사합니다. – Franch

+1

리틀 엔디안이 0x72, 0x6c, 0x64, 0x00 순서로 해당 바이트를 처리한다고 알려주는 경우그렇다면 빅 엔디안은 0x00, 0x64, 0x6C, 0x72가 될 것입니다. 두 경우 모두 ASCII 문자열이 C로 어떻게 끝나는 지 이해하고 있습니까? –

답변

1

기준 16의 값 57616은 e110입니다. 이 내 지식에 리틀 엔디안 10e1로 저장해야하지만 여전히 'e110', 어쩌면 % x 포맷터 작동 방식과 관련하여 인쇄?

올바른지, 출력되는 방법은 엔디안과 관련이 없습니다. 이는 빅 엔디안 컴퓨터에서는 변경되지 않습니다.

0x00646c72는 '없애'을 읽고 있지만, 빅 엔디안으로는 'DLR'인쇄 것이다 리틀 엔디안에 있도록 'DLR'와 같은 ASCII로 변환합니다. 이 asumptions 맞습니까?

처음에 0x00을 잊어 버렸습니다. (char *)에 캐스팅 된 값은 "rld"+ 0입니다. 큰 엔디안을 사용하면 0, 0x64, 0x6c, 0x72가 반환되고 종료되는 0은 첫 번째 문자가되고 인쇄 된 문자열은 비어집니다.

그래서 결과는 "he110 wo \ n"

관련 문제