哪位C语言高手帮忙解释一下(*(long*)&wiegand[0]) <<= 1;的意思。

看了一楼的回答,答案有点偏移了,wiegand[]是一个一维数组它的定义是这样的:
static uchar data wiegand[3];
而(*(long*)&wiegand[0]) <<= 1;根据程序我估计它是想把整个数组数据左移1位,然后取出wiegand[0]的值,至于中间的运算转换过程不太理解,哪位能帮忙解释一下?

&wiegand[0] 意思就是取wiegand[0]和地址;
(long*)&wiegand[0] 意思就是将地址转为整型指针;
(*(long*)&wiegand[0]) 意思就是取指针所指单元的内容,这里表达式等价于wiegand[0];
(*(long*)&wiegand[0]) <<= 1意思就是将wiegand[0])左移一位.
将我可以用下面的程序来验证:
#include <stdio.h>
void main()
{
int wiegand[4]={5,2,3,4};
printf("%d\n",(*(long*)&wiegand[0])<<=1 );
//上面就是输出wiegand[0],其值为5,左移一位(相当于乘2)的值应该是10.
//本例没有涉及二维数组,因此楼上的2位说法是错误的.
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-10-27
就是去wiegand[0][0]的值左移一位,也就是乘以2啦。

&wiegand[0],取二维数组首地址,即为wiegand[0][0]的地址;

(long *)强制转换地址类型;

(*(long*)&wiegand[0])取地址的值;

(*(long*)&wiegand[0]) <<= 1; 左移一位,即为乘以2
第2个回答  2010-10-27
看这个 &wiegand[0] 应该是个二维数组的首地址.值应该是wiegand[0][0]的值

(long *) &wiegand[0] 就是强转换成long型
(*(long*)&wiegand[0]) 就是取wiegand[0][0]的值(long型的)
第3个回答  2010-10-27
楼上的错了,看清楚好不好,是字符型数组啊,3个字符共24位,强制转换为32位长整型,整体左移,数组每个数都会被乘以2。
#include <stdio.h>
main()
{
static unsigned char wiegand[3]="123";
(*(long*)&wiegand[0]) <<= 1;
printf("%c\n",wiegand[0]); printf("%d\n",wiegand[0]);printf("%d\n",'1');
printf("%c\n",wiegand[1]);printf("%d\n",wiegand[1]);printf("%d\n",'2');
printf("%c\n",wiegand[2]);printf("%d\n",wiegand[2]);printf("%d\n",'3');
}
你可以自己试一试,首位bit溢出,有个乱码,1的ASCLL码为49,乘以2后为98,对应的字符为b,所以“123”乘以2后的字符为“bdf”
对应码制(十六进制):313233H
转换后为00626466H,
但是wiegand[0]输出的是Jc,不是b。可能是强制地址类型转换后,首地址以及补码的原因造成的,我在想一想