我正在尝试使用 gdb 调试 C 程序。我使用的编译标志如下
-fno-strict-aliasing -Wall -DHAVE_CONFIG_H -DNO_OLD_ERF_TYPES -Werror -Wredundant-decls -O2 -DNDEBUG -DBYTESWAP -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -g
我使用的编译器版本是
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
有争议的代码是以下行
spm->num_streams = (uint16_t)((MkIV->stream_counts >> 16 ) & 0xfff);
num_streams 的值with
-fno-strict-aliasing
0xffff (4095)
num_streams 的值WITHOUT-fno-strict-aliasing
0x1 (1)
现在值得注意的mkIV->stream_counts
是 is的实际值。0x10020
这是从HARDWARE REGISTER
我们感兴趣的值spm->num_streams
是BIT27:BIT16
。因此期望值是'1'
如果我要更换
spm->num_streams = (uint16_t)((MkIV->stream_counts >> 16 ) & 0xfff);
和
spm->num_streams = (uint16_t)((MkIV->stream_counts & 0xfff0000) >> 16);
然后我得到了0x1(1)
有和没有的价值-fno-strict-aliasing
MkIV 结构中的 stream_counts ( MkIV->stream_counts
is of uint32_t type
)
spm->num_streams is of type uint16_t
有人可以解释为什么会这样吗?