Chinaunix首页 | 论坛 | 博客
  • 博客访问: 201568
  • 博文数量: 63
  • 博客积分: 1970
  • 博客等级: 上尉
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-22 14:26
文章分类

全部博文(63)

文章存档

2013年(2)

2012年(11)

2011年(19)

2010年(6)

2007年(11)

2006年(14)

分类:

2006-12-14 13:46:15

 
 
一个比较代码.
 
  char p[] = "HTTP";
  if(*(unsigned long *)p != *(unsigned long *)"HTTP") 
  {
      printf("error!\n");
  }
  else
  {
      printf("right!\n");
  }
 
 
 
比较一下以下三个值你就知道了
 
        unsigned long n = *(unsigned long *)p;
        unsigned long n2 = *(unsigned long *)"HTTP";

        unsigned long n1;
        memcpy(&n1, (unsigned long *)"HTTP", sizeof("HTTP"));

1)(unsigned long *)p:把char指针p强制转换为unsigned long型指针,由于sizeof(unsigned long) = sizeof(char) * 4,因此这个时候这个强制转换后的指针可以指向包括原来p指针在内的四个字节的数据。

2)*(unsigned long *)p :对这个指针求值,也就是把p开始的四个字节的数据解释为unsigned long型的数据。

3)最后比较两个已经转换好的unsigned long数据。

这里的关键在于sizeof(unsigned long) = sizeof(char) * 4,而且需要比较的字符串“HTTP”正好是四个。

>这不是一个严格合格的程序(strictly conforming program),因为它的结果依赖于平台:在一个 sizeof(long) != 4 的系统上会得出错误的结论。作为一个技巧可以学习,但是程序不能这么写。字符串的比较还是要使用字符串比较函数(如 strcmp())

另外这也不是一个严格的程序,因为它的结果依赖与平台的能力,需要能把任意的 char *转成long *, 然后取值,俺手头的arm7和arm9就不具备这个能力,这种代码很容易导致一个alignment异常。

 

阅读(805) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~