为什么在此代码中显示1个字节,好像它是4?

时间:2015-08-02 13:23:54

标签: c sockets

我正在尝试在Assembly中编写我的C套接字代码(只是有点无聊并且认为它是一个有趣的练习)并且在尝试创建sockaddr_in结构的过程中我编写了这个小程序:

#include <stdio.h>
#include <string.h>
#include <netinet/in.h>

void showbytes(char *c, size_t len) {
    size_t i;
    for (i = 0; i < len; i++)
        printf("byte #%lu -> %x\n", i, c[i]);
}

int main(int argc, char* argv[]) {
    struct sockaddr_in q;

    bzero(&q, sizeof(q));

    q.sin_family = 0x02;
    q.sin_port = htons(0x1f90);
    q.sin_addr.s_addr = htonl(INADDR_ANY);

    union {
        struct sockaddr_in sai;
        char c[sizeof(struct sockaddr_in)];
    } un;
    un.sai = q;
    showbytes(un.c, sizeof(struct sockaddr_in));

    return 0;
}

我根本不了解的是输出如下:

byte #0 -> 2
byte #1 -> 0
byte #2 -> 1f
byte #3 -> ffffff90
byte #4 -> 0
byte #5 -> 0
byte #6 -> 0
byte #7 -> 0
byte #8 -> 0
byte #9 -> 0
byte #10 -> 0
byte #11 -> 0
byte #12 -> 0
byte #13 -> 0
byte #14 -> 0
byte #15 -> 0

为什么字节#3显示为4个字节?我检查了sizeof(in_port_t),它肯定是2个字节,但即便是这个问题。 char应该只有1个字节..我想我在这里缺少一些相当大的东西。

1 个答案:

答案 0 :(得分:4)

您缺少char已在您的实现上签名,而负值(解释为unsigned int(对于%x))是一个很大的值。您可能还会遗漏您无法将单字节值传递给变量函数(如printf) - 整数值始终会提升为至少intunsigned int

如果使用gcc或clang进行编译,请使用-funsigned-char使char类型无符号。那么这个问题就不会发生了。