C 返回int的第二个字节的地址或值

C 返回int的第二个字节的地址或值,c,pointers,C,Pointers,我声明了一个int,并在c中指定了一个值。在内存中,它如下所示 地址0x20002AD4处的0x78 0x01 0x00 0x00 我需要从int的第一个和第二个字节中提取值。我已经用以下代码成功地提取了第一个字节(参见数据包[2]) 但是,当我尝试使用指针算法返回int中第二个字节的值时(参见数据包[3]),它会返回第四个字节。我相信这是因为int的大小是4字节,所以地址上的+1会移动4字节 有谁能建议我如何返回第二个字节中的值,即在上面的示例中,我想返回0x01您想寻址字符数组的元素,而不是

我声明了一个int,并在c中指定了一个值。在内存中,它如下所示

地址0x20002AD4处的0x78 0x01 0x00 0x00

我需要从int的第一个和第二个字节中提取值。我已经用以下代码成功地提取了第一个字节(参见数据包[2])

但是,当我尝试使用指针算法返回int中第二个字节的值时(参见数据包[3]),它会返回第四个字节。我相信这是因为int的大小是4字节,所以地址上的+1会移动4字节


有谁能建议我如何返回第二个字节中的值,即在上面的示例中,我想返回0x01

您想寻址字符数组的元素,而不是将int作为数组处理:

unsigned char const * p = (unsigned char const *)&dataSize;

packet[2] = p[0];
packet[3] = p[1];

下面是给出的代码的完整示例程序(修改以获得字节的第二部分):

#包括
int main(){
int dataSize=0x7E06;
无符号字符包[4];
数据包[0]=0x7E;
数据包[1]=0x06;
数据包[2]=(无符号字符)数据大小;
数据包[3]=*((无符号字符*)&数据大小)+1);
printf(“%d,%d,%d,%d\n”,数据包[0],数据包[1],数据包[2],数据包[3]);
}

在我的电脑上,这将输出
126、6、6、126
。在其他体系结构上,字节可能会反转。

请注意Endianness。您必须将指针转换为char,而不是int。请尝试
((unsigned char*)和dataSize)[0]
(或分别为1)。@Acme这不是问题的根源。
unsigned char const * p = (unsigned char const *)&dataSize;

packet[2] = p[0];
packet[3] = p[1];
#include <stdio.h>

int main() {
    int dataSize = 0x7E06;
    unsigned char packet[4];

    packet[0] = 0x7E;
    packet[1] = 0x06;
    packet[2] = (unsigned char)dataSize;
    packet[3] = *(((unsigned char*)&dataSize) + 1);

    printf("%d, %d, %d, %d\n", packet[0], packet[1], packet[2], packet[3]);
}