精品理论电影在线_日韩视频一区二区_一本色道精品久久一区二区三区_香蕉综合视频

二級考試C++基礎:C/C++位域之我見

發布時間:2011-08-29 共3頁

  很早想說說這個問題了,經常也會有很多公司拿位域出來考人,呵呵要真的想弄清楚還要一點點的分析。
  這里先看看網宿的一道筆試題目:
  //假設硬件平臺是intel x86(little endian)
  char *inet_ntoa(uint32_t in)
  {
  static char b[18];
  register char *p;
  p = (char *)in;
  #define UC(b) (((int)b)&0xff)
  (void) snprintf(b, sizeof(b),
  "%d. %d. %d", UC(p[0]), UC(p[1]), UC(p[2]), UC(p[3]));
  return (b);
  }
  int main()
  {
  printf("%s, %s", inet_ntoa(0x12345678), inet_ntoa(87654321));
  }
  有點難度的一道題目,其實理解的也很簡單。
  位域分析
  位域是c++和c里面都有的一個概念,但是位域有一點要注意的有很多問題我們一樣樣的看:
  大端和小端字節序
  這個很簡單,就是起始點該怎么確定。
  先看一個程序:
  union {
  struct
  {
  unsigned char a1:2;
  unsigned char a2:3;
  unsigned char a3:3;
  }x;
  unsigned char b;
  }d;
  int main(int argc, char* argv[])
  {
  d.b = 100;
  return 0;
  }
  那么x的a1,a2,a3該怎么分配值,100的二進制是:0110 0100,那么a1到a3是不是就是依次取值恩?
  不是!
  我們先看看100分配位的低端是左邊的0還是右邊的0?很明顯是右邊的0,那么我們再看a1到a3的分配是從低端到高端的
  那么,對應的應該是
  <<<<<<--內存增大
  a3 a2 a1
  011 001 00
  內存增大之所以這么寫是因為,011是在高位!
  而不是通常認為的的:
  a1 a2 a3
  011 001 00
  還有一個情況多見就是一個二進制的數字轉化為點分十進制數值,如何進行,這里涉及到大端還是小端的問題,上面沒有涉及,主要是因為上面是一個字節,沒有這個問題,多個字節就有大端和小端的問題了,如下:
  int main(int argc, char* argv[])
  {
  int a = 0x12345678;
  char *p = (char *)&a;
  char str[20];
  sprintf(str,"%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
  printf(str);
  return 0;
  }
  這個程序假設是小端字節序,那么結果是什么?
  我們看看應該怎么放置呢?
  每個字節8位,0x12345678分成4個字節,就是從高位字節到低位字節:12,34,56,78,那么這里該怎么放?如下:
  ---->>>>>>內存增大
  78 56 34 12
  因為這個是小端,那么小內存對應低位字節,就是上面的結構。

百分百考試網 考試寶典

立即免費試用