您的位置 首页 > 问答

typedef union与typedef struct这两个类型定义的区别是什么

[本站 typedefunion与typedefstruct这两个类型定义的区别是什么typedefunion与typedefstruct这两个类型定义的区别是什么关于c语言中typedefunion和union的区别//双字公用体定义typedefunion{uns…

typedef union与typedef struct这两个类型定义的区别是什么

  • typedef union与typedef struct这两个类型定义的区别是什么
  • 关于c语言中typedef union和union的区别 // 双字 公用体定义
  • typedef union { unsigned int word; unsigned char byte[2]; }unWord16; 这是什么意思
  • 关于typedef union
  • 求助如何把C++的typedef union 转换成C#的struct
  • typedef union {long i; int k[5]; char c;} DATE; struct data { int cat; DATE cow; double dog;} too;
  • typedef union { int k[5]; double test; }TIME; 为什么sizeof(TIME)=24
  • 关于typedef union 的一个问题 谢谢啦
  • typedef union { long i;int k[5];char c; }DATE; struct date { int cat;DATE cow;double dog; }too;
  • typedef union { UBYTE BYTE; struct{ UBYTE A: 6; UBYTE B1:1; UBYTE B0:1; }BIT; }A; 这是什么意思!


struct 类型的内存分配是结合内部的所有变量大小和相关的,但不是简单的相加,从上面的例子就可以看出来, struct 类型的分配的内存大小是应该内部最大数据类型的整数倍,不足一倍的部分会自动补全成一倍大小,应该是编译器为了数据整齐,处理速度会快些把。 union 类型的内存分配,只是和联合体内的最大的一个数据类型的大小相关,而且 union 内的所有数据都在一个单独的内存空间里面。这些就是上面程序出现这样的结果的原因。


使用上是没有区别的,我有时候这么写,目地是为了避免链表结构中,指向自己前级单元的声明编译器无法离解,因此用个typedef让编译器认为这是一个类型.


就事综合类型,既是 unsigned short, 也是 byte
比较正确因该是用 unsigned short (2字节),不是unsigned int, unsigned int是(4)字节.
给你个例子:
typedef union { unsigned short word; unsigned char byte; }unWord16;
void main()
{
unWord16 test;
test.word=0xffbb;
test.byte=0xbb;
test.byte=0xff;
return;
}
test.word=0xffbb;

test.byte=0xbb;
test.byte=0xff;
结果是相同的


typedef union _USB_DEVICE_STATUS
{
byte _byte;
struct
{
unsigned RemoteWakeup:1;// Enabled: See usbdrv.c,usb9.c
unsigned ctrl_trf_mem:1;// ROM
};
} USB_DEVICE_STATUS;
相当于
union _USB_DEVICE_STATUS
{
byte _byte;
struct
{
unsigned RemoteWakeup:1;// Enabled: See usbdrv.c,usb9.c
unsigned ctrl_trf_mem:1;// ROM
};
};
typedef
union _USB_DEVICE_STATUS
USB_DEVICE_STATUS;
这两种写法
就是合起来写和分开写的区别而已
typedef
union 不是一种很特别的用法。
少打几个字符而已。
C++ :
struct,uion, class, enum 定义的名字可以单独使用
一般不会再写,像这样的代码,除非想写和C兼容的代码
C:
struct A{。。。。};
union B{。。。};
enum C{。。。};
A,B,C不是一个类型名字。struct A ,union B,enum C 才是类型名字。
C++:
struct A{...};union B{...};enum C{..};class T{...};
A,B,C,T 都是类型名字,可以直接定义变量。
typedef union _USB_DEVICE_STATUS
{
byte _byte;
struct
{
unsigned RemoteWakeup:1;// Enabled: See usbdrv.c,usb9.c
unsigned ctrl_trf_mem:1;// ROM
};
} USB_DEVICE_STATUS;
就有些画蛇添足的味道了。
typedef
union _USB_DEVICE_STATUS
USB_DEVICE_STATUS;
可以用 USB_DEVICE_STATUS代替union _USB_DEVICE_STATUS 当作类型名使用;
可以用来定义变量和内置类型区别不大。
所以C语言中,这种用法比较多。
C++中 自定义类型拥有和内置类型差不多的地位,这种用法就少见多了。


struct
{
string szRetText;
bool GetRight(int iIndex)
{
uint dwRight = (szRetText;
return dwRight & (1 《《 iIndex);
};
}EXAMPLE;


当struct data{ int cat; double dog; DATE cow;}结果是40+20=60
实际上是求sizeof(int cat;double dog; int k; ),
按最大字节对齐方式(8字节对齐方式),cat单独一个double里面,dog单独一个double里面,k可以放在一个double里面, 所以一共5个double,也就是40…… 所以,答案就是40+20=60……
其他一样。都是按最大字节对齐方式(8字节对齐方式)。


union的大小是按其成员中最大的一个分配的,这里按k分配,即5个int的大小,为20。不可能为24
我刚才试了下,在vc下得到的确实是24。但我在linux下编译得到的是20。这可能是编译器的问题,你用的是VC6.0吧,它其实有很多bug,换个VC2008吧


int k是占几个字节呀??20还是10呀??
*****************************************************
int有的机器是2字节,有的是4字节,与硬件有关.用printf(“%d “,sizeof(int)); 就可以看出是几
程序结果为52的话应该是int为4字节
x+5x+2x+5x=52 --》x=4
typedef union共用体每个成员共享存储空间,所以是最大的4*5
struct data结构体的话每个成员占用不同内存,所以是4+4*5+8
所以总共是20+32=52

sizeof(structdate)+sizeof(max)等于20+32等于52。

sizeof(max)是求max类型的大小,max的类型是baiunion结构,在union结构中所有变量共用同一个空间,在这个union中,i占4个字节,k[5]占20个字节,c占1个字节,因为是共用同一个空间,所以union的大小按最大的变量k[5]来算,占20个字节。

在structdate结构中,cat占4个字节,cow占20个字节,dog占8个字节,合起来就是32个字节。

扩展资料:

注意事项:

Max(浮动a,浮动b) {return (a》b?函数的返回值是B中的大数值,所以返回值类型应该是float!!

如果写入时没有在Max之前指定返回值类型,而C默认为int,那么在编译时应该会出现警告或错误

在表达式中,(float)10/2简单地将10转换为float,点数据和任何数据操作都会生成点数据,而在C中,对于常量(即常量而不是变量),点常量的默认类型是double!


UBYTE是宏定义过的 数据类型,应该是usigned char 类型的;
所以BYTE是 UBYTE类型的 变量,占8位;
同理A B1、B0也是UBYTE类型的变量,但 由于位域的概念,A只占6位,B1占1位,B0占1位;这其实是一种程序优化方案;
这个定义的总体意思是:
A类型占8位:如果想全部访问,那么就用A.BYTE,来访问;
如果想局部访问,就用A.BIT.A;A.BIT.B1;A.BIT.B2来访问。


相关tag:typedefunion
本站部分资源来源于网络,如果侵犯了您的权益,请联系我们删除1354090129@qq.com

标签:类型   in   字节   SB   所以

本文来自网络,不代表94汽车车网立场,所有(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者。若您的权利被侵害,请联系 56325386@qq.com 删除。转载请注明出处:https://94che.com/qc/186486.html

发表回复

您的电子邮箱地址不会被公开。

返回顶部