catch 发表于 2014-7-16 11:30:05

两种强制性转换有什么区别?

本帖最后由 catch 于 2014-7-16 12:50 编辑

①.
int a = 2;

long b = long (a);

printf("0x%x\n",&a);

②.
int a = 2;

long *b = (long *)&a;

printf("0x%x\n",&a);

大家说,以上两种转换有什么区别?

牡丹花下死做鬼 发表于 2014-7-16 12:18:07

第一个是对a的值进行转换第二个是对a的地址进行转换
#include<stdio.h>

int main()
{
        double p;
        p = 5.5;
        printf("%d\n",p);
        printf("%d\n",(int)p);
        printf("%d\n",(int*)&p);
        printf("%d\n",&p);

        return 0;
}
自己输出看看吧

catch 发表于 2014-7-16 12:36:17

牡丹花下死做鬼 发表于 2014-7-16 12:18
第一个是对a的值进行转换第二个是对a的地址进行转换

自己输出看看吧

我问的是本质上什么区别,不是输出的结果~

catch 发表于 2014-7-16 12:36:55

牡丹花下死做鬼 发表于 2014-7-16 12:18
第一个是对a的值进行转换第二个是对a的地址进行转换

自己输出看看吧

后两者的输出结果一样,为什么?

牡丹花下死做鬼 发表于 2014-7-16 12:37:43

catch 发表于 2014-7-16 12:36
后两者的输出结果一样,为什么?

应为地址本身就是整形的

牡丹花下死做鬼 发表于 2014-7-16 12:39:07

catch 发表于 2014-7-16 12:36
我问的是本质上什么区别,不是输出的结果~

没什么区别啊
double p;
printf("%d\n",(int*)&p);
等于
double p;
int i;
i = &p;
printf("%d\n",(int)p);
这两个完全是一样的啊

catch 发表于 2014-7-16 12:44:07

牡丹花下死做鬼 发表于 2014-7-16 12:39
没什么区别啊
double p;
printf("%d\n",(int*)&p);


用途完全一样?

牡丹花下死做鬼 发表于 2014-7-16 13:04:29

catch 发表于 2014-7-16 12:44
用途完全一样?

就是一个转换变量的值
一个转换变量的地址啊

catch 发表于 2014-7-16 13:08:08

牡丹花下死做鬼 发表于 2014-7-16 13:04
就是一个转换变量的值
一个转换变量的地址啊

そうか ~:big

oggplay 发表于 2014-7-16 14:57:04

本帖最后由 oggplay 于 2014-7-16 15:02 编辑

有趣的例子,以下是我64位机器程序及结果
#include <stdio.h>

int main(){

   int a2 = 2;

   long *b2 = (long *)&a2;

   printf("&b2=%p b2=%p &a2=%p\n",&b2,b2,&a2);

   return 0;
}

故乡的风 发表于 2014-7-16 15:08:32

两者有本质上的区别。前者,是将a的值进行转化后赋值给b;后者,直接将以变量a的地址为首地址的内存空间数据赋予新的使用意义。
举例说明,int类型a值为2,将a转化成double类型的b。前一种转化方式,会将2赋值给b;后一种,b为double型指针变量,b的值为a的首地址,*b会将这块空间的二进制值解释为double型数据。你可以了解下计算机是怎么存储浮点数,你就会发现问题所在了。这里没考虑int与double数据长度问题,根据编译器情况可能会发生越界,我就不详述了。

戏++ 发表于 2014-7-16 15:26:36

区别还是比较大的
前者直接把值转换,进行了复制
后者是把指针类型做转换,内存还是a所占用的内存 ,只不过是用long的方式去取值

zzminzzm 发表于 2014-7-16 16:28:24

第一个强转,它的作用在于值,跟类型强转
第二个强转,它的作用在于值跟地址,还有类型强转
页: [1]
查看完整版本: 两种强制性转换有什么区别?