我似乎已经把自己弄糊涂了,以至于这不再有意义。
1字节= 8位。
所以如果我有一个内存位置
0xdeadbeef
3735928559 (base10)
1101 1110 1010 1101 1011 1110 1110 1111
现在,如果我给0xdeadbeef
加上一个字节,我所加的二进制序列是什么?是1000
吗?如果我增加1位,我会得到0xdeadbee0
,如果我增加8位,我会得到0xdeadbef7
。哪个是正确的?
我记得在微处理器中,计数器在PC += 4中递增,这给出了0xdeadbef3
,所以我不确定哪个是正确的答案。
7条答案
按热度按时间vdgimpew1#
我从你的问题中理解到的是,你对向计数器添加一个位和一个字节感到困惑。
由于内存地址是以字节为单位(在编程语言中),因此对其进行的任何算术运算都是以字节为单位进行的。
要递增计数器,向其添加
1
就像将其递增到基址旁边的一个字节。将1
添加到0xdeadbeef
将使其递增为0xdeadbef0
。nkkqxpd92#
我指的是记忆的位置。
所以0xdeadbeef是一个地址。如果您将其增加1个字节,则只需向其添加1。即
0xdeadbeef + 1 = 0xdeadbef0
结束看起来像是在地址上增加1位,指针增加1个字节,因为您以字节粒度访问内存,并以字节数增加内存。但实际上你添加了数字1(即0x00000001)。如果你想增加4个字节,你就在地址上加4,因为内存是以字节数为单位寻址的。
p1iqtdky3#
什么是添加一个字节?字节必须具有值。您需要将number添加到数字,而不是将size(8位)添加到数字...
如果要添加的字节= 0x 08--> 1000,则0xdeadbeef+0x 08 = 0xdeadbeef 7
x6h2sr284#
如果,正如我所收集的那样,这是一个内存地址,它是以“基(零)地址之后的字节数”来衡量的,如果你在内存中向前移动一个字节,内存地址就会增加一个。
你可以这样想:如果你以米为单位测量从道路起点到道路的距离,如果你向前移动一米(这是你的测量单位),从起点到道路的距离增加1。
但是要小心,C(和C++)中的指针以一种稍微令人困惑的方式工作(一开始):如果你的指针是
T *
类型,那么if上的每个算术运算都是以T
为单位执行的,所以底层的内存地址以sizeof(T)
为步长移动。例如,如果您有:
2hh7jdfx5#
在计算机中,每个存储单元保存8位(1字节)的数据。因此,当我们添加1个字节时,它将简单地添加1个字节到内存位置。
goqiplq26#
当您将1加到字长的地址时,1被解释为十进制值为1的字长位串。
对于您的情况,
0xdeadbeef
有32位或4个字节。所以加1就像做0xdeadbeef + 0x00000001
。加300就像0xdeadbeef + 0x0000012C
如果您想知道是否可以向地址添加超过字大小的内容,这是不可能的,因为地址不能大于或小于字大小。
j5fpnvbx7#
字节表示法和数字的二进制等价物之间似乎存在混淆
一个字节由8位表示,因此二进制形式的1个字节将表示为
0000 0001
,而不是通过连续地加1.8次而形成的1个字节,即8个字节。字节通常用十进制表示,内存地址用十六进制表示。只能将一个十六进制数与另一个十六进制数相加。
十进制中的0到9字节相当于十六进制中的0x00到0x09字节,因此将0到9字节之间的任何内容添加到地址将是直接加法。如果您添加的字节大于9,则必须将其转换为十六进制并添加以移动到该地址。
因此,向
0xdeadbeef
添加一个字节将简单地导致0xdeadbeef + 1 = 0xdeadbef0
,或者作为示例,向0xdeadbeef
添加64个字节(0x40 bytes
)将是0xdeadbeef + 0x40 = 0xdeadbf2f