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 %xn", buff[0], buff[1], buff[2]);
}

这里我期望的输出是45 ab cd,但我得到的是45 ffffffab ffffffcd。有人能解释一下这是如何发生的,并分享一个获得预期价值的解决方案吗?

char在您的机器上签名,而0xab对于8位签名的数据类型是负值。所以当它被提升时,它会被提升到相同的负值,这就是0xffffffabint

解决方案:使用unsigned char

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

最新更新