我正在运行一个非常简单的程序,其变量名为vars
,它是一个整数数组,该数组的基数为0x555555558080
。
我有
vars[0] = 0x00004444;
vars[1] = 0x12345678;
然后运行gdb,我得到了:
(gdb) x/2xw 0x555555558080
0x555555558080 <vars>: 0x00004444 0x12345678
(gdb) x/4xh 0x555555558080
0x555555558080 <vars>: 0x4444 0x0000 0x5678 0x1234
(gdb) x/8xb 0x555555558080
0x555555558080 <vars>: 0x44 0x44 0x00 0x00 0x78 0x56 0x34 0x12
实际上对我来说没有意义。第一个输出告诉我,在地址0x555555558080
处,我拥有的第一个字节是0x00
,其他两个输出给我0x44
作为第一个字节。如果我真的读了给定地址上的值,那真的会有什么? 0x44
还是0x00
?
我首先想到的是小端的东西,所以在地址0x555555558084 (vars + 4)
转换之前我会得到0x78563412
,但是输出与此不一致,第一个给了我实际值0x12345678
,第二个0x5678 0x1234
,我希望是0x1234 0x5678
,第三个输出是little-endian版本。
我希望它是:
(gdb) x/2xw 0x555555558080
0x555555558080 <vars>: 0x00004444 0x12345678
(gdb) x/4xh 0x555555558080
0x555555558080 <vars>: 0x0000 0x4444 0x1234 0x5678
(gdb) x/8xb 0x555555558080
0x555555558080 <vars>: 0x00 0x00 0x44 0x44 0x12 0x34 0x56 0x78
答案 0 :(得分:1)
我首先想到的是小端的东西
是一点点东西。
实际存储的字节为:0x44 0x44 0x00 0x00 0x78 0x56 0x34 0x12
。剩下的就是你解释它们的方式。
如果将它们解释为两个32位int,则会得到0x00004444 0x12345678
。
如果将它们解释为四个16位整数,则会得到0x4444 0x0000 0x5678 0x1234
。
这里的所有内容都与低端计算机匹配。
我希望它是:
(gdb) x/4xh 0x555555558080 0x555555558080 <vars>: 0x0000 0x4444 0x1234 0x5678
好吧,您的期望是错误的。当您查看前两个字节时,它们是0x44 0x44
,因此您不能指望从中得到0x0000
。