gpt4 book ai didi

c - 为什么在此代码中显示的1字节好像是4?

转载 作者:行者123 更新时间:2023-12-03 11:51:06 25 4
gpt4 key购买 nike

我试图在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个字节。.我假设我在这里丢失了一些很大的东西。

最佳答案

您会丢失char在您的实现上签名的信息,并且负值(被解释为unsigned int)(对于%x)是一个很大的值。您可能还缺少无法将一个字节的值传递给诸如printf之类的可变参数的功能-整数值始终至少提升为intunsigned int

如果使用gcc或clang进行编译,请使用-funsigned-charchar类型设置为无符号。然后不会发生此问题。

关于c - 为什么在此代码中显示的1字节好像是4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31772329/

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