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上。
在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在内存中会是这样存放:
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)
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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
对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上。
在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在内存中会是这样存放:
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)
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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
对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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!