C/C++位域之我见
来源:优易学  2011-12-26 11:35:11   【优易学:中国教育考试门户网】   资料下载   IT书店

  接下来的问题又有点迷糊了,就是p怎么指向,是不是指向0x12345678的开头--12处?不是!12是我们所谓的开头,但是不是内存的开始处,我们看看内存的分布,我们如果了解p[0]到p[1]的操作是&p[0]+1,就知道了,p[1]地址比p[0]地址大,也就是说p的地址也是随内存递增的!
  12 ^ p[3]
  |
  34 | p[2]
  |
  56 | p[1]
  |
  78 | p[0]
  内存随着箭头增大!同时小端存储也是低位到高位在内存中的增加!这样我们知道了内存怎么分布了。
  那么:
  sprintf(str,"%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
  str就是这个结果了:
  120.86.52.18
  那么反过来呢?
  int main(int argc, char* argv[])
  {
  int a = 0x87654321;
  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位是一个字节那么就是这样的啦:
  87 ^ p[3]
  |
  65 | p[2]
  |
  43 | p[1]
  |
  21 | p[0]
  结果是:
  33.67.101.-121
  为什么是负的?因为系统默认的char是有符号的,本来是0x87也就是135,大于127因此就减去256得到-121
  那么要正的该怎么的弄?
  如下就是了:
  int main(int argc, char* argv[])
  {
  int a = 0x87654321;
  unsigned char *p = (unsigned char *)&a;
  char str[20];
  sprintf(str,"%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
  printf(str);
  return 0;
  }
  用无符号的!
  结果:
  33.67.101.135
  位域的符号(正负)
  看完大端和小端以后,再看看位域的取值的问题,上面我们谈到了一些,首先就是位域是按照位来取值的跟我们的int是32位char是8位一样,很简单,但是,要注意一点就是位域也有正负,指有符号属性的,就是最高位表示的,也会涉及到补码这个一般被认为非常恶心的东西,看看程序吧:
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  int main(int argc, char** argv)
  {
  union
  {
  struct
  {
  unsigned char a:1;
  unsigned char b:2;
  unsigned char c:3;
  }d;
  unsigned char e;
  } f;
  f.e = 1;
  printf("%d\n",f.d.a);
  return 0;
  }

上一页  [1] [2] [3] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训