乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      位域排序structendian

       ShaneWu 2008-09-27

      Big-Endian 和 Little-Endian 字節(jié)排序

      字節(jié)排序 含義
      Big-Endian 一個Word中的高位的Byte放在內(nèi)存中這個Word區(qū)域的低地址處。
      Little-Endian 一個Word中的低位的Byte放在內(nèi)存中這個Word區(qū)域的低地址處。


      必須注意的是:表中一個Word的長度是16位,一個Byte的長度是8位。如果一個數(shù)超過一個Word的長度,必須先按Word分成若干部分,然后每一部分(即每個Word內(nèi)部)按Big-Endian或者Little-Endian的不同操作來處理字節(jié)。

      一個例子:
      如果我們將0x1234abcd寫入到以0x0000開始的內(nèi)存中,則結(jié)果為
      big-endian little-endian
      0x0000 0x12 0xcd
      0x0001 0x34 0xab
      0x0002 0xab 0x34
      0x0003 0xcd 0x12
      Top

      5 樓shockwave_115(采姑娘的小蘑菇) 回復(fù)于 2005-06-18 14:06:48 得分 0
      怎么寫一個函數(shù)判斷機器是big_endian還是little_endian?Top

      6 樓zhousqy(標(biāo)準(zhǔn)C匪徒)(甩拉,甩拉) 回復(fù)于 2005-06-18 14:33:49 得分 7
      #include <stdio.h>

      int
      main(int argc, char **argv)
      {
      union {
      short s;
      char c[sizeof(short)];
      } un;

      un.s = 0x0102;

      if (sizeof(short) == 2) {
      if (un.c[0] == 1 && un.c[1] == 2)
      printf("big-endian\n");
      else if (un.c[0] == 2 && un.c[1] == 1)
      printf("little-endian\n");
      else
      printf("unknown\n");
      } else
      printf("sizeof(short) = %d\n", sizeof(short));

      exit(0);
      }
      測試下面說法:我們知道一個結(jié)構(gòu) 在不同的compiler下其在內(nèi)存中的map是不一樣的。

      比如在VC(little Endian)
      struct TypeA {
      unsigned long a:1;
      unsigned long b:1;
      unsigned long c:3;
      unsigned long d:3;

      unsigned long e:1;
      unsigned long f:1;
      unsigned long g:1;
      unsigned long h:1;
      unsigned long i:1;
      unsigned long j:2;
      unsigned long k:1;
      unsigned long l:12;
      unsigned long m:1;
      unsigned long n:3;
      }

      在Window下(little Endian)其在內(nèi)存中的Map為:
      n|m|l|k|j|i|h|g|f|e|d|c|b|a


      而在MIPS下(Big Endian)其在內(nèi)存中的Map為:
      a|b|c|d|e|f|g|h|i|j|k|l|m|n;

      這些都是編譯器造成的影響;

      奇怪的little/big endian問題,請大家發(fā)言
      樓主mimepp(你好呀) 2005-06-21 12:36:42 在 VC/MFC / ATL/ActiveX/COM 提問
      進(jìn)來看帖子的朋友都幫著up一下,讓帖子別沉了.

      問題描述:
      從網(wǎng)絡(luò)上某window XP的PC上收到一串內(nèi)容 buffer, 表示為16進(jìn)制如下: (共11 bytes)
      00 b9 0b ,01 00 00 00, 00 04 00 00
      ----->
      內(nèi)存中看到的內(nèi)容如上,從左往右是內(nèi)存地址增加方向.
      現(xiàn)在有個指針指向 "01" 的位置. 用char *data表示.
      這個data的內(nèi)容是要賦值給一個結(jié)構(gòu)的.
      struct test
      {
      int a;
      int b;
      };

      void fun(char *data, int datalen)
      {
      struct test *t = (struct test*)data; //data指向"01"所在的地方.
      printf("result, a: 0x%08x, b: 0x%08x\n", t->a, t->b);
      printf("result, a: %d, b: %d\n", t->a, t->b);
      }
      傳進(jìn)去的 datalen = 8;

      得到的結(jié)果應(yīng)該是
      result, a: 0x00000001, b: 0x00000400
      result, a: 1, b: 1024

      也就是說,我要得到"01"后面, 每4個字節(jié)的內(nèi)容到一個int中.

      但實際運行的結(jié)果卻不是如此. 實際的結(jié)果是:
      result, a: 0x010bb900, b: 0x00000000
      result, a: 17545472, b: 0

      即我本來想得到的數(shù)據(jù)應(yīng)該為"01" 后面的內(nèi)容,但實際的結(jié)果卻是走到了"01"左邊的幾個字節(jié)上.
      b的內(nèi)容也變成了"01" 后面的"00"的那4個字節(jié).

      以上的代碼是運行在某ARM開發(fā)板上的結(jié)果.
      開發(fā)板上sizeof(int)是 4
      即4個字節(jié)表示一個整數(shù).
      sizeof(struct test)為8
      data的指針point為0x09...87, 后面的兩位為87. 中間的沒記下.

      后來經(jīng)過改寫:
      struct test tmp;
      memcpy( &tmp, data, sizeof(sturct test));
      printf("result, a: 0x%08x, b: 0x%08x\n", tmp->a, tmp->b);
      printf("result, a: %d, b: %d\n", tmp->a, tmp->b);
      使用memcpy 來復(fù)制內(nèi)存內(nèi)容后,結(jié)果輸出正確. memcpy應(yīng)該是把data右邊的內(nèi)容copy正確到了tmp中.問題最后是解決了的.


      疑問:
      1. 有人說不是little/big endian的問題,是數(shù)據(jù)結(jié)構(gòu)struct test對齊的問題. 大家什么意見?
      說是從"data的指針point為0x09...87, 后面的兩位為87." 看出的問題. 不被4整除? 好像不是這樣吧.大家聊聊自己的看法.
      2. 錯誤出現(xiàn)時, 取到的結(jié)果是
      a: 01 0b b9 00
      b: 00 00 00 00
      也就是在字串被這樣處理了
      00 b9 0b 01, 00 00 00 00, 04 00 00
      即data指向的"01"被當(dāng)成了高位.低位在它的左邊. 即得到的是"01"加上它左邊的3個字符,而不是右邊的3個字符.
      不知是否這樣解釋?
      但這個解釋好像很奇怪喔. 怎么跑到了左邊?

      3. 一般大家討論的情況可能只會涉及到
      01 00 00 00, 00 04 00 00
      這個的排列的內(nèi)容的含義:
      如:
      一種排列為:
      01 00 00 00
      00 04 00 00
      另一種排列為:
      00 00 00 01
      00 00 04 00

      但我這里遇到的是實際運行系統(tǒng)中的現(xiàn)象. 和這個討論有點不同.
      請大家就我的實際例子來討論.
      4. 難道是內(nèi)存中數(shù)據(jù)被其他的代碼"踩到", 出錯了?
      5. 不知道代碼中其他地方還有沒有這樣的后患.呵呵.

      相關(guān)知識,來自網(wǎng)絡(luò):
      1. Big-Endian 和 Little-Endian 翻譯為: 大端,小端
      2. Big-Endian 和 Little-Endian
      這兩個術(shù)語來自于 Jonathan Swift 的《《格利佛游記》其中交戰(zhàn)的兩個派別無法就應(yīng)該從哪一端--小端還是大端--打開一個半熟的雞蛋達(dá)成一致。:)
      在那個時代,Swift是在諷刺英國和法國之間的持續(xù)沖突,Danny Cohen,一位網(wǎng)絡(luò)協(xié)議的早期開創(chuàng)者,第一次使用這兩個術(shù)語來指代字節(jié)順序,后來這個術(shù)語被廣泛接納了
      摘自《深入理解計算機系統(tǒng)》
      3. 含義:
      big endian:最高字節(jié)在地址最低位,最低字節(jié)在地址最高位,依次排列。
      little endian:最低字節(jié)在最低位,最高字節(jié)在最高位,反序排列。
      沒記錯的話,除了moto的68K系列和dec的sparc是big endian外,常見的cpu都是little endian。ARM同時支持big和little,實際應(yīng)用中通常使用little endian。

      歡迎大家討論. http://cache.baidu.com/c?word=struct%2Cendian&url=http%3A//topic%2Ecsdn%2Enet/t/20050621/12/4096371%2Ehtml&p=cb759a42dd9812a059ed8535540894&user=baidu

      一個微軟面試題--關(guān)于位結(jié)構(gòu)體

      2007-09-23 08:49:23
      大中小
      標(biāo)簽:學(xué)習(xí)公社
      備案待查,指不定啥時候就用上了。
      寫出下列程序在X86上的運行結(jié)果。
      struct mybitfields
      {
      unsigned short a : 4;
      unsigned short b : 5;
      unsigned short c : 7;
      }test;

      void main(void)
      {
      int i;
      test.a=2;
      test.b=3;
      test.c=0;
      i=*((short *)&test);
      printf("%d ",i);
      }
      這 個題的為難之處呢,就在于前面定義結(jié)構(gòu)體里面用到的冒號,如果你能理解這個符號的含義,那么問題就很好解決了。這里的冒號相當(dāng)于分配幾位空間,也即在定義 結(jié)構(gòu)體的時候,分配的成員a 4位的空間, b 5位,c 7位,一共是16位,正好兩個字節(jié)。下面畫一個簡單的示意:
      變量名 位數(shù)
      test    15 14 13 12 11 10 9 |8 7 6 5 4 |3 2 1 0
      test.a                       |           |0 0 1 0
      test.b                       |0 0 0 1 1 |
      test.c   0 0 0 0 0 0 0 |           |
      在 執(zhí)行i=*((short *)&test); 時,取從地址&test開始兩個字節(jié)(short占兩個字節(jié))的內(nèi)容轉(zhuǎn)化為short型數(shù)據(jù),即為0x0032,再轉(zhuǎn)為int型為 0x00000032,即50。輸出的結(jié)果就是50。當(dāng)然,這里還涉及到字節(jié)及位的存儲順序問題,后面再說。
           
      前面定義的結(jié)構(gòu)體被稱為位結(jié)構(gòu)體。所謂位結(jié)構(gòu)體,是一種特殊的結(jié)構(gòu)體,在需要按位訪問字節(jié)或字的一個或多個位時,位結(jié)構(gòu)體比按位操作要更方便一些。
      位結(jié)構(gòu)體的定義方式如下:
      struct [位結(jié)構(gòu)體名]{
      數(shù)據(jù)類型 變量名:整數(shù)常數(shù);
      ...
      }位結(jié)構(gòu)變量;
      說明:
      1)這里的數(shù)據(jù)類型只能為int型(包括signed和unsigned);
      2)整數(shù)常數(shù)必須為0~15之間的整數(shù),當(dāng)該常數(shù)為1時,數(shù)據(jù)類型為unsigned(顯然嘛,只有一位,咋表示signed?光一符號?沒意義呀);
      3)按數(shù)據(jù)類型變量名:整數(shù)常數(shù);方式定義的結(jié)構(gòu)成員稱為位結(jié)構(gòu)成員,好像也叫位域,在一個位結(jié)構(gòu)體中,可以同時包含位結(jié)構(gòu)成員及普通的結(jié)構(gòu)成員;
      4)位結(jié)構(gòu)成員不能是指針或數(shù)據(jù),但結(jié)構(gòu)變量可以是指針或數(shù)據(jù);
      5)位結(jié)構(gòu)體所占用的位數(shù)由各個位結(jié)構(gòu)成員的位數(shù)總各決定。如在前面定義的結(jié)構(gòu)體中,一共占用4+5+7=16位,兩個字節(jié)。另外我們看到,在定義位結(jié)構(gòu)成員時,必須指定數(shù)據(jù)類型,這個數(shù)據(jù)類型在位結(jié)構(gòu)體占用多少內(nèi)存時也起到不少的作用。舉個例子:
      struct mybitfieldA{
      char a:4;
      char b:3;
      }testA;
      struct mybitfieldB{
      short a:4;
      short b:3;
      }testB;
      這 里,testA占用一個字節(jié),而testB占用兩個字節(jié)。知道原因了吧。在testA中,是以char來定義位域的,char是一個字節(jié)的,因此,位域占 用的單位也按字節(jié)做單位,也即,如果不滿一個字節(jié)的話按一個字節(jié)算(未定義的位按零處理)。而在testB中,short為兩個字節(jié),所以了,不滿兩個字 節(jié)的都按兩個字節(jié)算(未定義位按零處理)
      關(guān)于位結(jié)構(gòu)體在內(nèi)存中的存儲問題
      Kevin‘s Theory #2: In a C structure that contains bit fields, if field A is defined in front of field B, then field A always occupies a lower bit address than field B. (來自http://www./forum/showflat.php?Cat=&Board=linuxk&Number=638637&page=0&view=collapsed&sb=5&o=all&fpart=all
      說的是,在C結(jié)構(gòu)體中,如果一個位域A在另一個位域B之前定義,那么位域A將存儲在比B小的位地址中。
      如果一個位域有多個位時,各個位的排列順序通常是按CPU的端模式(Endianess)來進(jìn)行的,即在大端模式(big endian)下,高有效位在低位地址,小端模式則相反。
      補充說明一個關(guān)于位域與普通結(jié)構(gòu)成員一起使用的問題
      先看一個例子
      struct mybitfield{
      char a:4;
      char b:3;
      char aa;
      char c:1;}test;
      這種情況下,test應(yīng)該占幾個字節(jié)呢?2個(4+3+1=8占一個字節(jié),aa占一個)還是3個(4+3不足補一位,占一個字節(jié),aa占一個字節(jié),c占一個字節(jié))?
      寫個小程序驗證一下:
      int main(int argc, char* argv[])
      {
      int i;
      test.a = 1;
      test.b = 1;
      test.aa = 1;
      test.c = 1;

      i=*((short *)&test);
      printf("%d \n",i);

      return 0;
      }

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多