按类型来看
a是long
&a是long*
(int*)&a是int*
*((int*)&a)相当于 *(int*)&a, 类型是int
(int)(*((int*)&a))相当于上面那个加一个强制转换,但是int转int没许可转的,实际上就是
*(int*)&a
把long作为int来解释。在VC这样的编译器里,long和int是一样长的,并且两者都带符号,所以我的理解,那个表达式其实就相当于
(long)a
而 a = a - (int)a; 因为vc里int和long是一样的,所以相当于
a=0;
long a;//定义 a 为变量,长整型
int m1 = &a; //取a的地址(不是值)
int m2=(int*)m1; // ----- 将m1指针地址指向的值赋值到M2,也就是m2=a ,
int m3 = (int)(*m2); // -----将m2指针地址指向的值赋值到m3,
----------------一句话,就是取 a 为地址偏移量的内存值转化成整型。
应该可以直接写成 a=a-(int)(*a);///这样有点危险,如果 int 不等同于 long ,
则内存范围可能超过,程序直接就挂掉了。
所以
a = a - (int)(*(( int *)&a)) ;
和 a = a - (int) a; 肯定不一样。
在 VC 等 32位中 long 是等同于 int。
部分系统则不是,(int) a 可能造成 高位字节数据丢失。
-----------------------------呵呵,好久没做理论研究了,未必正确,^_^。
不管a是64位、转换为32位还是a是32位转换为16位都没有发现差异。
VC6,可能你编译器问题吧。
/*
#define LARGENUM 9999999999999
#define FORMATSTR "I64u"
typedef unsigned _int64 MYLONG ;
typedef unsigned int MYINT ;
*/
#define LARGENUM 99999999
#define FORMATSTR "u"
typedef long MYLONG ;
typedef short MYINT ;
int main()
{
MYLONG a=LARGENUM;
a = a - (MYINT)(*((MYINT *)&a)) ;
printf("a is %"FORMATSTR"\n",a);
a=LARGENUM;
a = a - (MYINT) a;
printf("a is %"FORMATSTR"\n",a);
}
32位转16位的结果是:
a is 100007936
a is 100007936
没有差异