鱼C论坛

 找回密码
 立即注册
查看: 2311|回复: 12

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

[复制链接]
发表于 2014-7-16 11:30:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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);

大家说,以上两种转换有什么区别?
Tulips.jpg
Tulips.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
自己输出看看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2014-7-16 12:36:17 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-7-16 12:18
第一个是对a的值进行转换第二个是对a的地址进行转换

自己输出看看吧

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

点评

没什么区别啊 double p; printf("%d\n",(int*)&p); 等于 double p; int i; i = &p; printf("%d\n",(int)p); 这两个完全是一样的啊  详情 回复 发表于 2014-7-16 12:39
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-16 12:36:55 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-7-16 12:18
第一个是对a的值进行转换第二个是对a的地址进行转换

自己输出看看吧

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

点评

应为地址本身就是整形的  详情 回复 发表于 2014-7-16 12:37
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-16 12:37:43 | 显示全部楼层
catch 发表于 2014-7-16 12:36
后两者的输出结果一样,为什么?

应为地址本身就是整形的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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);
这两个完全是一样的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-16 12:44:07 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-7-16 12:39
没什么区别啊
double p;
printf("%d\n",(int*)&p);

用途完全一样?

点评

就是一个转换变量的值 一个转换变量的地址啊  详情 回复 发表于 2014-7-16 13:04
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-16 13:04:29 | 显示全部楼层
catch 发表于 2014-7-16 12:44
用途完全一样?

就是一个转换变量的值
一个转换变量的地址啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-16 13:08:08 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-7-16 13:04
就是一个转换变量的值
一个转换变量的地址啊

そうか ~:big
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
抓图2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 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数据长度问题,根据编译器情况可能会发生越界,我就不详述了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-16 15:26:36 | 显示全部楼层
区别还是比较大的
前者直接把值转换,进行了复制
后者是把指针类型做转换,内存还是a所占用的内存 ,只不过是用long的方式去取值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-16 16:28:24 | 显示全部楼层
第一个强转,它的作用在于值,跟类型强转
第二个强转,它的作用在于值跟地址,还有类型强转
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-29 00:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表