利用联合体完成一些数据处理的问题
发布时间:2020-12-14 03:00:55 所属栏目:大数据 来源:网络整理
导读:?联合体的特性之一就是成员共用内存,以最大成员的大小开辟空间。 在一些情况下,这个特性也是在其他编程技巧中出现的,比如数据类型的强制转换, int t;char c=(char)t; 不管数据类型怎么转换,都表示同一段代码在同一段内存,这个和联合体是相似的,比如在
?联合体的特性之一就是成员共用内存,以最大成员的大小开辟空间。 在一些情况下,这个特性也是在其他编程技巧中出现的,比如数据类型的强制转换, int t; char c=(char)t; 不管数据类型怎么转换,都表示同一段代码在同一段内存,这个和联合体是相似的,比如在一个例子中,要解决浮点数的正负判断,一般可能就是直接利用if语句使浮点数和0进行比较,但是这是有风险的,记得之前有个问题如下 #include<stdio.h> int main() { int a = -6; unsigned int b = 4; if((a+(int)b) > 0) printf("a+b>0n"); else printf("a+b<0n"); int z = a+b; printf("z= %dn",z); if(z > 0) printf("z>0"); else printf("z<0"); } 对不不同类型的数据尽量不要去加减比较,为了避免这个问题,我们可以使用联合体解决一些问题。还是判断浮点数的正负问题, typedef union compare{ float f; int i; }comp;
#include<stdio.h> #include<stdlib.h> typedef union compare{ float f; int i; }comp; int main() { comp c; float f; scanf("%f",&f); c.f=f; if((c.i&0x80000000)) printf("negtiven"); else printf("positiven"); return 0; }
1.2? positive 联合体在linux2.6内核中也有目前看到的一个用途----进程内存栈 union thread_union { struct thread_info thread_info; unsigned long stack[THREAD_SIZE/sizeof(long)]; }; struct thread_info { struct task_struct *task; /* main task structure */ struct exec_domain *exec_domain; /* execution domain */ unsigned long flags; /* low level flags */ unsigned long status; /* thread-synchronous flags */ ... .. } 这样做的目的,目前理解为对栈的大小可控,因为THREAD_SIZE是可改变的,在编译内核时。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |