C语言 将一个字节添加到十六进制数

h9vpoimq  于 2023-06-21  发布在  其他
关注(0)|答案(7)|浏览(160)

我似乎已经把自己弄糊涂了,以至于这不再有意义。
1字节= 8位。
所以如果我有一个内存位置

0xdeadbeef
3735928559 (base10)
1101 1110 1010 1101 1011 1110 1110 1111

现在,如果我给0xdeadbeef加上一个字节,我所加的二进制序列是什么?是1000吗?如果我增加1位,我会得到0xdeadbee0,如果我增加8位,我会得到0xdeadbef7。哪个是正确的?
我记得在微处理器中,计数器在PC += 4中递增,这给出了0xdeadbef3,所以我不确定哪个是正确的答案。

vdgimpew

vdgimpew1#

我从你的问题中理解到的是,你对向计数器添加一个位和一个字节感到困惑。
由于内存地址是以字节为单位(在编程语言中),因此对其进行的任何算术运算都是以字节为单位进行的。
要递增计数器,向其添加1就像将其递增到基址旁边的一个字节。将1添加到0xdeadbeef将使其递增为0xdeadbef0

nkkqxpd9

nkkqxpd92#

我指的是记忆的位置。
所以0xdeadbeef是一个地址。如果您将其增加1个字节,则只需向其添加1。即0xdeadbeef + 1 = 0xdeadbef0

结束看起来像是在地址上增加1位,指针增加1个字节,因为您以字节粒度访问内存,并以字节数增加内存。但实际上你添加了数字1(即0x00000001)。如果你想增加4个字节,你就在地址上加4,因为内存是以字节数为单位寻址的。

p1iqtdky

p1iqtdky3#

什么是添加一个字节?字节必须具有值。您需要将number添加到数字,而不是将size(8位)添加到数字...
如果要添加的字节= 0x 08--> 1000,则0xdeadbeef+0x 08 = 0xdeadbeef 7

x6h2sr28

x6h2sr284#

如果,正如我所收集的那样,这是一个内存地址,它是以“基(零)地址之后的字节数”来衡量的,如果你在内存中向前移动一个字节,内存地址就会增加一个。
你可以这样想:如果你以米为单位测量从道路起点到道路的距离,如果你向前移动一米(这是你的测量单位),从起点到道路的距离增加1。
但是要小心,C(和C++)中的指针以一种稍微令人困惑的方式工作(一开始):如果你的指针是T *类型,那么if上的每个算术运算都是以T为单位执行的,所以底层的内存地址以sizeof(T)为步长移动。
例如,如果您有:

int a[2];
int *ptr=a;
int *ptr2=ptr+1;
printf("Delta in ints: %d", (int)(ptr2-ptr));  // will print 1
char *cptr=(char *)ptr;
char *cptr2=(char *)ptr2;
printf("Delta in chars: %d", (int)(cptr2-cptr)); // will print sizeof(int), typically 4
2hh7jdfx

2hh7jdfx5#

在计算机中,每个存储单元保存8位(1字节)的数据。因此,当我们添加1个字节时,它将简单地添加1个字节到内存位置。

goqiplq2

goqiplq26#

当您将1加到字长的地址时,1被解释为十进制值为1的字长位串。
对于您的情况,0xdeadbeef有32位或4个字节。所以加1就像做0xdeadbeef + 0x00000001。加300就像0xdeadbeef + 0x0000012C
如果您想知道是否可以向地址添加超过字大小的内容,这是不可能的,因为地址不能大于或小于字大小。

j5fpnvbx

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

相关问题