在 c 中进行类型转换后出现意外值

Unexpected value after type casting in c

我正在实现通过原始套接字发送数据的代码。作为其中的一部分,我必须构建一个 IP 数据包。但是我遇到了下面使用示例程序解释的问题。

#include <stdio.h>

struct iph {
    unsigned char ihl:4;
    unsigned char ver:4;
    unsigned char data;
    unsigned char data1;
};

int main()
{
    char buff[3] = {0};

    struct iph *ptr = (struct iph *)buff;
    ptr->ihl = 5;
    ptr->ver = 4;
    ptr->data = 0xAB;
    ptr->data1 = 0xCD;

    printf("%x %x %x\n", buff[0], buff[1], buff[2]);
}

这里我期望的输出是 45 ab cd 但我得到的是 45 ffffffab ffffffcd。任何人都可以解释这是如何发生的并分享解决方案以获得预期价值吗?

char 在您的计算机上签名,0xab 是 8 位签名数据类型的负值。因此,当它被提升时,它会提升为相同的负值,即 0xffffffabint.

解决方法:使用unsigned char

你的代码有两个问题,第一个 buff 数组必须是 4 大小而不是 3,第二个你的 buff 类型必须是 unsigned char