C 为什么x/1tw与gdb中的x/4tb相比有误,或者x/1tw在某些方面有用?

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

关于我关于在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

# 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”的三行(或构成该图片的位图,取决于您喜欢的方式)实际上不在内存中,这是否会误导您?