왕초보 질문입니다. - - ;;;

하하의 이미지

아래 코드는 왜 big endian 머신과 little endian 머신에서 동일한

결과 값을 출력할까요?????

암만 생각해도 답이 안나와 이곳 kldp에 물어봅니다.

감사합니다.....

main()
{

        unsigned short int source;

        unsigned short int conv = 0;


        source = 333;


        conv = (source & 0xff00) >> 8;
        conv |= (source & 0x00ff) << 8;



        printf(" source : %d \n", source);


        printf(" conv : %d \n", conv);

}
dhjung의 이미지

conv = (source & 0xff00) >> 8;
conv |= (source & 0x00ff) << 8; 

위코드는 결국 source 의 두 바이트의 위치를 서로 swap하는 역활을 하는 코드입니다.

big endian환경에서, source의 첫번째, 두번째 byte의 값이 각각 A, B라 가정하면,
위의 코드를 수행한, conv의 값은 BA의 값을 가지게 됩니다..

이를 little endian 환경에서도 똑같이 적용하게 되면, conv의 값은 AB값을 가지게 됩니다..

따라서, endian 환경에 상관없이 출력값은 서로 같게 되는겁니다..


--------------------------
Donghyun Jung

lasher의 이미지

지난번 big/little endian 질문 올리신 분이군요.

저번에 말씀 드린 것처럼 big/little endian은 하드웨어 차원의 문제입니다. 즉 byte 열들을 직접 메모리로 입출력을 하기 위한 것이 아니라면 전혀 신경을 쓰실 필요가 없습니다.

C는 hi-level language입니다. 말씀 하신 코드는 전혀 endian과 관련이 없습니다. 0xff00 이든 0x00ff 이든 이것과 shift 연산을 하든 이것은 C 자체의 논리적인 공간(?) 내에서 표현이 되기 때문이고요, 이 논리적인 표현을 real code로 구현하는 것은 컴파일러와 하드웨어 문제입니다.

shift 연산이나 사칙연산(+ - * /)이나 마찬가지입니다. 이 연산은 C의 논리적인 공간에서 수행되는 별개의 영역입니다. 만약 이들 결과 값이 하드웨어의 big/little endian에 따라 달라진다면 엄청난 혼란이 오겠지요.

다시 말씀드리지만 메모리를 직접적으로 다루는 (pointer도 관련되겠지요) 상황이 아니라면 endian은 신경쓰실 필요가 전혀 없습니다. 따라서 위의 코드는 어떤 기계이든 똑같은 결과를 내는 것이지요.
마치 1000+2000가 3000이라는 것을 big/little endian machine이 같은 결과값을 출력하는 것처럼요.

하하의 이미지

감사합니다.. ^^;;

문제는 %d로 찍어서 그렇게 똑같이 보였던 거군요...

......

“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.