C 为什么x/1tw与gdb中的x/4tb相比有误,或者x/1tw在某些方面有用?
关于我关于在gdb中显示内存的帖子,我被告知int数据类型是以最低有效字节优先存储的。例如变量C 为什么x/1tw与gdb中的x/4tb相比有误,或者x/1tw在某些方面有用?,c,gdb,C,Gdb,关于我关于在gdb中显示内存的帖子,我被告知int数据类型是以最低有效字节优先存储的。例如变量i,它存储129的值 # Display size of int (gdb) p sizeof(int) $2 = 4 # Display 4 bytes on which int is stored (gdb) x/4tb &i 0xbffff320: 10000001 00000000 00000000 00000000 # Displa
i
,它存储129的值
# Display size of int
(gdb) p sizeof(int)
$2 = 4
# Display 4 bytes on which int is stored
(gdb) x/4tb &i
0xbffff320: 10000001 00000000 00000000 00000000
# Display 1 word (4 bytes) on which int is stored (spaces were added for better understanding)
(gdb) x/1tw &i
0xbffff320: 00000000 00000000 00000000 10000001
正如您所看到的,两种输出都不同。现在我知道,x/4tb
显示int,因为它实际上存储在内存中,x/1tw
反转它的八位字节。可以验证它,例如,当您想在0xbfff320
(gdb) x/1tb 0xbffff320+1
0xbffff321: 00000000
(gdb) x/1tb 0xbffff320+2
0xbffff322: 00000000
(gdb) x/1tb 0xbffff320+3
0xbffff323: 00000000
我的问题是:为什么与gdb中的
x/4tb
相比x/1tw
具有误导性,或者如果x/1tw
对某些东西有用?它如何具有误导性?不同的标志要求gdb以不同的方式解释数据。如果您要求它显示该地址的ascii值,它会告诉您一些不同的内容,但这不会误导您,它只会显示您所要求的内容。如果您要求它显示存储在该地址的浮点值,它将再次显示不同的内容。为什么会产生误导?命令x/4tb
显示从目标地址开始的四字节序列的每个字节的二进制表示。命令x/1tw
在目标地址显示一个(四字节)机器字的二进制表示。这些是不同的事情。如果你想这样想的话,后者是前者的一种特殊解释。@Art误导你的原因是i
有地址0xbfff320
。第一个字节存储10000001
。当您访问最后一个字节时(将3添加到0xbfff320
),您将得到00000000
,这是正常的。但是,当您查看x/1tw
输出并尝试访问0xbfff323
时,您不会得到10000001
,而是00000000
,因此在x/4tb
输出中,字节的顺序似乎与内存中的顺序相同,但在x/1tw
中,它们是颠倒的。另一方面,误导性也是x/4tb
,因为它首先存储最低有效字节(我希望它应该是最后一个)。我正试图找出如何最好地阅读这些输出。这并没有误导。您要求它“将此地址的4字节值解释为32位字,然后将其显示为位”。当gdb将101字节值打印为“a”时,当您要求它将其解释为ascii字符时,即使构成“a”的三行(或构成该图片的位图,取决于您喜欢的方式)实际上不在内存中,这是否会误导您?