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 cdBut I got 45 ffffffab ffffffcd. 任何人都可以解释这是如何发生的并分享解决方案以获得预期价值吗?

米奇

char在您的机器上签名并且0xab对于 8 位签名数据类型是负值。所以,当它得到推广,它被提升到相同的负值,这就是0xffffffab作为一个int

解决方法:使用 unsigned char

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章