我有int类型的变量i,其值为129.我在gdb中使用了这个变量的各种表示。
# Decimal format of i
(gdb) p/d i
$18 = 129
# Binary format of i
(gdb) p/t i
$19 = 10000001
# Address of variable i
(gdb) p &i
$20 = (int *) 0xbffff320
# Binary format displayed at one byte
(gdb) x /tb &i
0xbffff320: 10000001
# Decimal format displayed at four bytes (one word)
(gdb) x /dw &i
0xbffff320: 129
# Decimal format displayed at one byte
(gdb) x /db &i
0xbffff320: -127
以上输出可能是由于10000001
中的-127
相当于# Size of int in bytes:
(gdb) p sizeof(int)
$22 = 4
根据此page如果我错了请纠正我。
根据这个:
AAAAAAAA: XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
我知道int在计算机内存中占用4个字节。因此,如果我的理解是正确的,那么数字驻留在内存中的某个地址上并消耗4个字节(或32位,或1个字或1/2个巨大字)。然后这个数字的表示看起来像这样:
AAAAAAAA is the location in memory and
XXXXXXXX is the bits of that number (i have divided this bits into four octets for better understanding)
,其中
&
因此,当我访问int号时,我需要知道它的地址以及消耗的位数。因此int消耗32位并且可以使用# Binary format displayed as one word (4 bytes) (I have put space between group of 8 bits for better understanding)
(gdb) x /tw &i
0xbffff320: 00000000 00000000 00000000 10000001
# Binary format displayed as four bytes
(gdb) x/4tb &i
0xbffff320: 10000001 00000000 00000000 00000000
运算符获得地址。这是我在内存中的实际int表示(BTW为什么两个不同的是它与系统上的字节序设置有什么关系?):
0xbffff320: 00000000 00000000 00000000 10000001
AAAAAAAA: XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
AAAAAAAA: 8bits 8bits 8bits 8bits
8*3=24
(24)DEC == (0x18)HEX
0xbffff320 + 0x18 = 0xBFFFF338
现在进行一些基本的数学运算:
11001100
0xBFFFF338应该是我上一个八位字节的地址。那么为什么这会给我10000001
而不是(gdb) x/tb 0xBFFFF338
0xbffff338: 11001100
?
(3)DEC == (3)HEX
0xbffff320 + 0x3 = 0xbffff323
(gdb) x/tb 0xbffff323
0xbffff323: 00000000
我正在打印一个字节。如果我打印整个int消耗4个字节(我不这样做,这在我的情况下甚至是可能的,因为我没有对应于这个内存的变量名,但是你明白了)这可能是一些奇怪的数字因为我在声明的变量之后访问内存并且可能存在一些垃圾,而且我的10000001将驻留在最重要的八位字节中,但为什么现在呢?
编辑: 根据建议,我添加了3个字节,而不是之前的24个字节,但结果仍然是错误的:
10000001
仍然没有返回{{1}}这里有什么问题?
答案 0 :(得分:1)
保持简单。表达式向地址添加了24个字节,而不是地址的24位。
答案 1 :(得分:1)
看来你自己已经解决了这个问题:
(gdb) x /tb &i
0xbffff320: 10000001 #### Look at the address of this byte ####
# Binary format displayed as four bytes
(gdb) x/4tb &i
0xbffff320: 10000001 00000000 00000000 00000000
# +0 +1 +2 +3
首先使用最低有效字节存储整数。其他3个字节保持00000000
所以大概是
(gdb) x/tb 0xbffff320
0xbffff320: 10000001
(gdb) x/tb 0xbffff321
0xbffff321: 00000000
(gdb) x/tb 0xbffff322
0xbffff322: 00000000
(gdb) x/tb 0xbffff323
0xbffff323: 00000000