"Irvine"또는 "WriteString"과는 아무런 관련이 없습니다.
짧은 대답은 당신이보고있는 것은 당신이 리틀 엔디안 인 인텔 x86 아키텍처를 프로그래밍하고 있다는 사실의 직접적인 결과이며, 일부에 의해 작성되었습니다 어셈블러를 사용하고 있다는 점이다 오래된 해커.
긴 대답은 다음과 같습니다.
당신은 위키 백과 나 다른 곳에서 그것을보고, 다음에 대한 엔디 언을 알아야 할 모든 것을 배워야한다 어셈블리 언어를 처리하는 경우, 그러나 바이트가 연속적인 메모리 위치에 저장하는 방법을 정의하는 한마디 보다 큰 바이트 수를 형성합니다.
- 큰 엔디안 및
- 리틀 엔디안 : 엔디안 두 가지 유형이 있습니다.
리틀 엔디안은 바이트보다 큰 수의 경우 우선 순위가 가장 낮은 ("낮음") 바이트가 먼저 저장되고이어서 더 높은 중요도의 바이트가 먼저 저장된다는 것을 의미합니다. 결과적으로, DWORD
에는 최하위 ("낮음") 단어가 먼저 저장되고 최상위 ("높음") 단어가 저장됩니다. 이것은 빅 엔디안의 상위이며, 상위 바이트가 먼저 저장됩니다.빅 엔디안은 직관적이라고 생각할 수 있습니다. 왜냐하면 인간이 숫자를 어떻게 표현하는지에 가장 가깝기 때문입니다. 가장 중요한 숫자는 가장 왼쪽 숫자이고 그 다음 숫자는 덜 중요합니다.하지만 그것은 인간뿐입니다. 그것은 완전히 임의적입니다. 숫자의 중요성은 왼쪽에서 오른쪽으로 또는 오른쪽에서 왼쪽으로 정렬해야한다는 숫자의 본질에 대해서는 아무 것도 없습니다. 반대로 리틀 엔디안에는 하드웨어 이점이 있습니다. 인텔이 x86 아키텍처를 선택한 이유입니다.
하지만 나는 빗 나간다.
그래서, 여기에 무슨 일이 일어나고있는 것입니다 :
당신이 현명하게하려고, 당신은 문자열 리터럴을 사용하여 DWORD
의 값을 지정할 수 있도록하는 데 사용하는 어셈블러. DWORD
은 문자열이 아닌 숫자을 포함하기로되어 있지만 더러운 해킹을 수용하려고하기 때문에 무의미합니다. 그것은 또한 전적으로 임의적입니다. 왜냐하면 그러한 버크가 구현 될 수 있다고 상상할 수있는 많은 방법들이 있고, 그들은 한 가지 방법만을 선택했기 때문에, 나는 그들이 가장 좋아한다고 생각합니다.
그래서 분명히 그들이하는 일은 문자열 리터럴을 취하고이를 DWORD
을 구성하는 4 개의 문자 그룹으로 간주하는 것입니다. 물론 메모리에 DWORD
을 저장하면 인텔 아키텍처에 적합한 리틀 엔디안으로 저장되므로 "Fizz"대신 "zziF"가됩니다. 이 "zziF"는 어셈블러에서 프로그램으로 구워지고 "WriteString"함수는 그것을 보는대로 인쇄한다는 것을 이해하는 것이 중요합니다. 문자열을 인쇄하는 다른 함수를 사용하는 경우에도 동일한 내용이 인쇄됩니다. 함수의 잘못이 아닙니다.
설명해 주셔서 감사합니다. 글쎄, 내가 이미 "FizzBuzz"를 DWORD로 저장하려했지만, "너무 큰 상수"크기로 인해 빌드 오류가 발생했습니다. 아직 크기 제한을 알지 못합니다. 그러나 나는 엔디안에 대해 배우고 있었지만 이런 일을 일으킬 수는 없지만 결코 그렇게하지는 못했습니다. 기본적으로 DWORD 대신 Byte를 사용하면 BYTE로 4 개의 청크가 있고, 작은 엔디안으로 예상대로 작동 할 것입니다. –
예, 개별 바이트로 엔디안 문제가 발생하지 않습니다. "너무 큰 상수"에 대해서는 어셈블러가 DWORD에 맞는 문자열 리터럴을 예상하므로 분명히 4 자로 제한됩니다. 쉼표 뒤에 오는 0은 또 다른 4 바이트를 차지하는 또 다른 DWORD로 인코딩됩니다. 재미를 위해서, 당신은 QWORD를 지원하는 어셈블러를 볼 수 있습니다. 그런 다음'zzuBzziF'를 얻어야합니다. –
감사합니다, 당신은 저를 많이 도왔습니다! 우리의 연구 사례에서 나는 심지어 QWORD를 보지 못했고, 나는 지금 막 새로운 것을 배웠습니다. 감사! 지금 나는 zzuBzziF와 놀 수있다! :) - –