为什么共用体变量输出的值不一样
㈠ C\C++联合体(共用体)数值问题,高手请进!高分配英雄!
共用体的特慎森点时,同一个共用体内的各个变宽逗亩量的地址相同。以这个为例,a,b,c及x的变量地址是相同的,比如在我的VC2008的显示地址是0x0012ff60。x所占的字节就等于a\指稿b\c里占字节最大的,也就是a和b,都占4个字节,那么x也占4个字节。x的值是100。也就是说下面这样。
0x0012ff60 64
0x0012ff61 00
0x0012ff62 00
0x0012ff63 00
那么a的值也是100,确切的说是0x00000064 ,也就是10进制的100. c占一个字节,应该为0x64,也就是10进制的100.
b是浮点型,他在内存中存放和整形不一样。浮点数据在内存中的存放方式比较复杂,不好理解。
你可以在网上查下。
根据IEEE的标准,浮点数的定义如下
符号位 指数位 小数部分 指数偏移量
单精度浮点数 1 位[31] 8位 [30-23] 23位 [22-00] 127
双精度浮点数 1 位[63] 11 位[62-52] 52 位[51-00] 1023
把0x00000064换成4字节32位的二进制看下
00000000 00000000 0000000 01100100
第32位是符号位,0是正,1是负
30-23位是指数,
22-0位是小数。
不知道TC环境下为什么是0.000,没有装TC ,不过1.4013e-043近似值是0.0000
㈡ 共用体变量
共用体实际共用的是同一块存储地址(看哪个变量类型大,最大类型的变量确定了地址的大小),比如int a,与long long b,假设int是4字节,long long是8字节,那么地址位数就是按8字节分配的,假设b的8字节的起始位绝尘置是0x0000,末位置是0x0007.那么a的起始地址是0x0000,末地址是0x0003。当你对任意一个变量赋值槐镇时都可能会改变a或b的值(因为共用同一块地址,比如对a赋值,如果前四位地址存储的数据不变,那么b就不变,对于b也是同样的道理),a,b的值都能读出来,因为分配了内存,只不过读出来的值可能和你预期的不一样而已。所以共用体的值都是以最后铅宏粗一次对那个变量赋值为准。
㈢ c语言共用体输出问题
这个是共用体的问题
由于共用体共用同一段起始内存的地址,所以后一次的数据写入可能会覆盖前一次的数据
然后lz这道题,如果系统将int做2直接处理(比如TC2)的话,结果是380039和9;如果是按4字节处理的话,结果应该是39和9
下面针对lz的结果,讲一迹棚亏下2字节处理的情况
第一姿神个共用体成员是int的数组,两个元素,和运共4字节
第二个成员是long,4字节
第三个成员是char数组,4个元素,4字节
所以这个union变量共4字节
s.a[0]=0x39;
s.a[1]=0x38;
导致变量s的内存存储的16进制数据(小尾存储的话)高位到低位依次为为
00 38 00 39
所以才会导致输出380039和9
4字节处理的话,同理