c语言中给b赋值b=0X12345678是什么意思?输出b=%x,为何是78?

如题所述

0x12345678
这个是16进制的表示方法
转换成2进制
1 0010 0011 0100 0101 0110 0111 1000
union {int a; long b; unsigned char c; } m;
由于m是个联合结构
所以整个结构在内存中占一个long这么大的空间(在vc6.0中是32位二进制,现在应该是占64位),同时三个元素a,b,c共用这段内存
好了,
由于
m.b = 0x12345678;
所以,赋值后这段内存空间内的值就为:
0001 0010 0011 0100 0101 0110 0111 1000 (低32位,)
好了
unsigned char c;
c是个unsigned char类型
所以只取低8位二进制位,转成无符号char类型的数:
0111 1000
这8位二进制数,转成10进制数,就是120
所以
printf("%d\n", m.c);
以10进制整数的形式输出m.c就是120
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-04
/*
b=0X12345678代表16进制的12345678
b=%x表示将b以%x的格式输出,
也就是以16进制的格式

如果输出的是78,
那么这个b应该是char类型
即b只占一个字节,
这样自动舍弃123456这前3个字节

所以b=0x78

不知道你的b变量是char类型吗

*/追问

是的。为什么不输出12而是78呢? 为何要舍掉前3个字节。

追答

/*
数据在内存中存放遵循高低原则

也就是高字节内容存放在高地址
低字节内容存放在低地址

所以,0x12345678在内存中是这样存放的
78的二进制
56的二进制
34的二进制
12的二进制
从上到下地址依次增加

通常这组数据的第一个内存单元的地址
也就是78对应的内存单元编号
表示整体的内存地址

如果是int类型就取出这4个字节
如果是float类型就从低字节开始取出一个字节
所以只能取出78
*/

第2个回答  2012-06-04
b是什么类型? 用16进制给b赋值。 %x是16进制格式化追问

b是 char型的。有一个c程序是这样的:
#include
viod main()
{ union
{long i;
char ii;
char s[4];
}mix;
mix.i=0x12345678;
printf("mix.i = %lx\n",mix.i);
printf9"mix.ii=%x\n",mix.ii);
printf("mix.s[0]\t mix.s[1]=%x\n",mix.s[0],mix.s[1]);
}
为什么他的输出是
mix.i=12345678
mix.ii=78
mix.s[0]=78 mix.s[1]=56

追答

char 是8位的,一般我们的程序默认使用的是小端存储。 0x12345678,前面6个数字被舍掉了。只剩最小的8位了,也就是0x78.

union 是联合体,取最大的地址空间为它的空间。 mix里的就是long
mix.i=12345678 // 一般long32位够用了,输出正常
mix.ii=78 //同char
mix.s[0]=78 mix.s[1]=56 因为小端存储在内存的存储地址顺序为 78 56 34 12。

本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网