相信很少人用,但我急!普通变量是否可以强制转换成位域结构类型.

cbx_xx 2007-11-28 10:48:12
//我希望能转换成功,还希望输出结果是6.高手们有好招吗?


#include <stdio.h>
#include <iostream.h>
typedef union TDTMP_s {
unsigned int raw;
struct {
unsigned int tx_transimit : 3,
tx_flush : 1,
rx_watermark : 3,
rx_mode : 1,
rfu_1 : 8,
rfu_2 : 8,
rfu_3 : 8;

} fld;
} TDTMP_t;


void main()
{
unsigned int gSendData=0x0046;
TDTMP_t gTranData=(TDTMP_t)gSendData;
printf("tx_transimit:%x",gTranData.fld.tx_transimit);
}
//我希望能转换成功,还希望输出结果是6.高手们有好招吗?
...全文
320 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
_石头_ 2007-11-29
  • 打赏
  • 举报
回复
楼10说得好,我正这样用呢.谢谢各位.至于顺序的问题,我不担心.这是单片机里运行的.不会有什么通用性
-------------------------------------------------------------------------------------
如果这样的话,那其实没必要用union ,直接用结构体就行了!而且随时可以用整数付值:

typedef struct
{
unsigned int tx_transimit : 3;
unsigned int tx_flush : 1;
unsigned int rx_watermark : 3;
unsigned int rx_mode : 1;
unsigned int rfu_1 : 8;
unsigned int rfu_2 : 8;
unsigned int rfu_3 : 8;
}fld

int a;
fld *b=(fld *)&a;
a=0x46; //直接给这个整数付值就是了!
cqpp 2007-11-29
  • 打赏
  • 举报
回复
首先是非得这样实现么?union->int = 0x46不行么?我的程序尽量只用最简单的东西。如果是寄存器这些的话,用移位还好点。
zh1369 2007-11-29
  • 打赏
  • 举报
回复
16楼的,俺同意。
yang511yang 2007-11-29
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <iostream.h>
typedef union TDTMP_s {
unsigned int raw;
struct{
unsigned int tx_transimit:3;
unsigned int tx_flush:1;
unsigned int rx_watermark:3;
unsigned int rx_mode :1;
unsigned int rfu_1 :8;
unsigned int rfu_2 :8;
unsigned int rfu_3 :8;
}fld;
}TDTMP_t;


void main()
{
unsigned int gSendData=0x0046;
TDTMP_t gTranData;
// gTranData=*((TDTMP_t *)&gSendData);
gTranData.raw=gSendData;
printf("tx_transimit:%x",gTranData.fld.tx_transimit);
return 0;
}
yang511yang 2007-11-29
  • 打赏
  • 举报
回复
//借楼上大壳
typedef struct
{
unsigned int tx_transimit : 3;
unsigned int tx_flush : 1;
unsigned int rx_watermark : 3;
unsigned int rx_mode : 1;
unsigned int rfu_1 : 8;
unsigned int rfu_2 : 8;
unsigned int rfu_3 : 8;
}fld

int a=0x46;
fld b=*((fld *)&a);

AI老徐 2007-11-28
  • 打赏
  • 举报
回复
10说的可以,而且这正是体现出了unio的用法

但这解决不了此操作不可控状态,因为,字节顺序和位顺序不可知。不同的计算机可能会出现不同的结果。当然,如果已知了各种顺序条件,那10的这个方法才是正解。
JobSeeker 2007-11-28
  • 打赏
  • 举报
回复
弱弱的问一下,
TDTMP_t gTranData;
gTranData.raw = gSendData;
这样行不行啊,或者干脆自己写个初始化函数好了
独孤过儿 2007-11-28
  • 打赏
  • 举报
回复
没考虑。。。

_石头_ 2007-11-28
  • 打赏
  • 举报
回复
过儿,如果目标机器不是32位的怎么办?
独孤过儿 2007-11-28
  • 打赏
  • 举报
回复
我看了下,正好32位,可以压缩成一个int来存储,然后用移位来提取指定的位
AI老徐 2007-11-28
  • 打赏
  • 举报
回复
用移位,这种方式效率会更好,通用性更强
#define WIDTHMASK(WIDTH) (~0 ^ (~0<<WIDTH))
#define GETWIDTHBITSFROMN(SRC,WIDTH,N) ((SRC >> N) & WIDTHMASK(WIDTH))
在SRC里取从N位开始的宽WIDTH位的值。SRC最多是机器字啊。表超界了
xugang_2001 2007-11-28
  • 打赏
  • 举报
回复
你需要什么样的所谓“更好”的方法 你预想中的更好地方法是啥呢?
cbx_xx 2007-11-28
  • 打赏
  • 举报
回复
楼上的,你还有更好的方法吗?我只是想取其中某段而已.
晨星 2007-11-28
  • 打赏
  • 举报
回复
不过这玩意儿不跨平台的哈。
一种编译器没问题,不代表另一种编译器也没问题;一种编译器弄出来的结果,也不见得等于另一种编译器的结果。
晨星 2007-11-28
  • 打赏
  • 举报
回复
如果你一定要这样做,可以用指针:

unsigned int gSendData=0x0046; 
TDTMP_t* gTranData=(TDTMP_t*)&gSendData;
printf("tx_transimit:%x",gTranData->fld.tx_transimit);
IlikeEnglish 2007-11-28
  • 打赏
  • 举报
回复
非要用这种拙劣的方式实现吗?
cbx_xx 2007-11-28
  • 打赏
  • 举报
回复
楼10说得好,我正这样用呢.谢谢各位.至于顺序的问题,我不担心.这是单片机里运行的.不会有什么通用性

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧