OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3562|回复: 8

这句一段话看不懂,求教

[复制链接]

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-3-19 11:21:37 | 显示全部楼层 |阅读模式
3金钱
#define BYTE0(dwTemp)       (*(char *)(&dwTemp))               
#define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))         
#define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))         
#define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))         

typedef union {unsigned char byte[4];float num;}t_floattobyte;
t_floattobyte floattobyte;


上面两段第一段说是将整型拆分成char型的,但是不是很理解,第二段是定义了一个共用体变量,但是后来t_floattobyte floattobyte;这句不是很懂,能否帮忙解释一下呀。谢谢

最佳答案

查看完整内容[请看2#楼]

#define BYTE0(dwTemp) (*(char *)(&dwTemp)) #define BYTE1(dwTemp) (*((char *)(&dwTemp) + 1)) #define BYTE2(dwTemp) (*((char *)(&dwTemp) + 2)) #define BYTE3(dwTemp) (*((char *)(&dwTemp) + 3)) BYTE0(dwTemp) 取出指针dwTemp指向的内容的第0个字节 BYTE1(dwTemp) 取出指针dwTemp指向的内容的第1个字节 BYTE2(dwTemp) 取出指针dwTemp指向的内 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-3-19 11:21:38 | 显示全部楼层
本帖最后由 操作系统 于 2017-3-19 12:05 编辑

#define BYTE0(dwTemp)       (*(char *)(&dwTemp))               
#define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))         
#define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))         
#define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))   

BYTE0(dwTemp)  取出指针dwTemp指向的内容的第0个字节
BYTE1(dwTemp)  取出指针dwTemp指向的内容的第1个字节
BYTE2(dwTemp)  取出指针dwTemp指向的内容的第2个字节
BYTE3(dwTemp)  取出指针dwTemp指向的内容的第3个字节

typedef union {unsigned char byte[4];float num;}t_floattobyte; // 定义一个新的类型 t_floattobyte
t_floattobyte floattobyte; //声明一个变量,类型是t_floattobyte

typedef  定义新的 数量类型就用它了.也可以理解为别名.为一个数据类型另起一外别名.

C语言在这种情况表达方式太复杂了.取地址,强制转换,再读内容.我也感觉好麻烦..
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
 楼主| 发表于 2017-3-19 14:14:25 | 显示全部楼层
操作系统 发表于 2017-3-19 11:21
#define BYTE0(dwTemp)       (*(char *)(&dwTemp))               
#define BYTE1(dwTemp)       (*((ch ...

你好,谢谢你的解答。但是还是有一点不理解。
#define BYTE0(dwTemp)       (*(char *)(&dwTemp)) 拿着一句话来说,使用#define 过后BYTE0(dwTemp)就代表了 (*(char *)(&dwTemp)),然后使用BYTE0(dwTemp)这个的时候实际上真正操作的是(*(char *)(&dwTemp)),这一部分我理解的应该没错吧?但是(*(char *)(&dwTemp))这一部分具体拆分了该怎么理解呢?&dwTemp这个是取dwTemp变量的地址吧,然后(char *)(&dwTemp) 是表示为指向dwTemp的地址指针吗? 还有就是 (*(char *)(&dwTemp))怎么体现出来的是取出指针dwTemp指向的内容的第0个字节的呢?非常感谢你上面你的解答,但是还是没理解好
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
 楼主| 发表于 2017-3-19 14:28:48 | 显示全部楼层
操作系统 发表于 2017-3-19 11:21
#define BYTE0(dwTemp)       (*(char *)(&dwTemp))               
#define BYTE1(dwTemp)       (*((ch ...

非常感谢你的解答,能再帮我解释一下吗。我是最近想做一个四轴,然后通过串口把加速度传感器测量的数据传给另外一个CPU,然后在显示屏上显示出来,然后对两个cpu之间的串口通信不是很会,所以找了网上的一个例子,然后例子是这样写的,但是看得不是很懂,谢谢
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-3-19 14:35:32 | 显示全部楼层
不管什么指针变量,在内存的占用空间是 相同的.所以他们可以相互强制转换.
(*(char *)(&dwTemp)) ,先把变量 dwTemp 地址取出来,强制转换为 char * 类型,再*取内容.这个时候的内容就是按char 的类型所占内存空间计算出来的.
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
 楼主| 发表于 2017-3-19 14:45:18 | 显示全部楼层
操作系统 发表于 2017-3-19 14:35
不管什么指针变量,在内存的占用空间是 相同的.所以他们可以相互强制转换.
(*(char *)(&dwTemp)) ,先把变 ...

恩,好的,非常感谢你的详细解答。
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
 楼主| 发表于 2017-3-19 14:48:41 | 显示全部楼层
arao和xiaomi 发表于 2017-3-19 14:45
恩,好的,非常感谢你的详细解答。

你好,就是因为我是在自学就是关于嵌入式的东西,然后想自学做一个四旋翼,但是感觉还是比较困难,因为都是自己一个人弄,然后有时候碰到一些困难又不知道怎么解决,就想今天碰到这种问题还好有你详细的解答,然后才弄明白。就是你能不能给我一些建议呀,非常感谢
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-3-23 23:43:23 | 显示全部楼层
arao和xiaomi 发表于 2017-3-19 14:48
你好,就是因为我是在自学就是关于嵌入式的东西,然后想自学做一个四旋翼,但是感觉还是比较困难,因为都 ...

囫囵吞枣也是一个不错的处理方法.没有彻底明白之前,可以尝试暂时不追根问底.像用库程序一样,先用着.
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
 楼主| 发表于 2017-3-24 08:26:30 | 显示全部楼层
操作系统 发表于 2017-3-23 23:43
囫囵吞枣也是一个不错的处理方法.没有彻底明白之前,可以尝试暂时不追根问底.像用库程序一样,先用着.

恩,感觉还是自己见的程序少了,用的东西少了,谢谢你
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-23 01:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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