gpt4 book ai didi

c - 奇怪的 printf() 行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:28 26 4
gpt4 key购买 nike

我在这个问题中附加的代码应该获取设备的 mac 地址并打印它。当我将数据从 struct ifreq 复制到 uint8_t 数组时它起作用,但当我不这样做时,我得到奇怪的结果。查看输出的第二行和第二个字节。

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <net/ethernet.h>
#include <sys/types.h>
#include <stdint.h>

int main()
{
uint8_t tab[6];
int i;
struct ifreq one;
int sd = socket(AF_PACKET, SOCK_RAW, 0);

memset(&one, 0, sizeof(struct ifreq));

strcpy(one.ifr_name, "eth0");

int v = ioctl(sd, SIOCGIFHWADDR, &one);

memcpy(tab, one.ifr_hwaddr.sa_data, sizeof(uint8_t) * 6);
for(i=0;i<6;i++)
printf("%02x:", tab[i]);
printf("\n");

for(i=0;i<6;i++)
printf("%02x:", one.ifr_hwaddr.sa_data[i]);
printf("\n");
}

输出:

74:86:7a:0a:2c:6d:

74:ffffff86:7a:0a:2c:6d:

最佳答案

您是在问为什么第二个字节打印为 ffffff86 而不是 86?这是因为它被符号扩展了。 one.ifr_hwaddr.sa_data[i] 数组声明为带符号的字符数组,但您的 tab[] 数组是无符号的。

printf 的参数都被提升为 int。无符号字符 0x86 被提升为 0x00000086,但当相同的值被假定为有符号时,它被提升为 0xFFFFFF86。

关于c - 奇怪的 printf() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22694762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com