麻烦各位给指导下如何做

时间:2022-10-11 15:48:48
:struct 位域的排列,如:
 union u{
struct {
 char i:1;
 char j:2;
 char m:3;
 } s;
 char c;
 }r;
 然后给r赋值, r.s.i = 1; r.s.j = 2; r.s.m = 3; ?
 最后问 r.c 的值是多少?


顺便解释下,XX

10 个解决方案

#1


我运行的结果是0。
在vc6.0上。

#2


哦..是29.忘赋值了。

#3


如何算呢?我想求大家的解题过程,不仅仅是答案

#4


二进制为00011101,转换成十进制就是29了

#5


楼上是按3 2 1连起来的....

#6


ansi c 中对 bit field 描述的很少,因为其中很多与具体实现相关,搂主要小心了

#7


在本题中,共用体r只有1B即8bit的空间,可以先将这8bit先初始化为0000 0000,

 r.c=0;
 r.s.i = 1; r.s.j = 2; r.s.m = 3;

按上面的语句进行赋值,那么r在内存中会是这样存放:
00(2bit) m(3bit) j(2bit) i(1bit)
00       011     10      1
输出r.c时,就是输出0001 1101,也就是29了。
这个结果也不是一定的,因为不同的计算机在存储单元中位段的空间分配方向可能不同。
也许会出现这种情况:
i(1bit)  j(2bit)  m(3bit) 00(2bit)

#8


r只占1字节,是因为sizeof(r)=max(sizeof(s),sizeof(c)),而sizeof(s)=1B,sizeof(c)=1B,所以sizeof(r)=1B。

#9


楼上说的有理

#10


VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

#1


我运行的结果是0。
在vc6.0上。

#2


哦..是29.忘赋值了。

#3


如何算呢?我想求大家的解题过程,不仅仅是答案

#4


二进制为00011101,转换成十进制就是29了

#5


楼上是按3 2 1连起来的....

#6


ansi c 中对 bit field 描述的很少,因为其中很多与具体实现相关,搂主要小心了

#7


在本题中,共用体r只有1B即8bit的空间,可以先将这8bit先初始化为0000 0000,

 r.c=0;
 r.s.i = 1; r.s.j = 2; r.s.m = 3;

按上面的语句进行赋值,那么r在内存中会是这样存放:
00(2bit) m(3bit) j(2bit) i(1bit)
00       011     10      1
输出r.c时,就是输出0001 1101,也就是29了。
这个结果也不是一定的,因为不同的计算机在存储单元中位段的空间分配方向可能不同。
也许会出现这种情况:
i(1bit)  j(2bit)  m(3bit) 00(2bit)

#8


r只占1字节,是因为sizeof(r)=max(sizeof(s),sizeof(c)),而sizeof(s)=1B,sizeof(c)=1B,所以sizeof(r)=1B。

#9


楼上说的有理

#10


VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!