努力学习的小马 2023-06-13 16:20 采纳率: 85.7%
浏览 12
已结题

一个关于socket字节序的问题


#include <stdio.h>

int main() {

    union {
        short value;    // 2字节
        char bytes[sizeof(short)];  // char[2]
    } test; 

    test.value = 0x0102;
    if((test.bytes[0] == 1) && (test.bytes[1] == 2)) {
        printf("大端字节序\n");
    } else if((test.bytes[0] == 2) && (test.bytes[1] == 1)) {
        printf("小端字节序\n");
    } else {
        printf("未知\n");
    }

    printf("%s",test.bytes);

    return 0;
}

这是一个识别自己的主机是小端字节序还是大端字节序的程序,我在linux系统下编译运行,为什么最后 printf("%s",test.bytes);这行没有输出任何内容,输出结果如下:

img

另外可以麻烦大伙们解释下为什么令test的值为0x0102,bytes就自动填值了呢?

  • 写回答

1条回答 默认 最新

  • 於黾 2023-06-13 16:37
    关注

    union 是个联合体,联合体类似结构体struct,区别是struct中每个成员占据相同大小的不同内存,而联合体中每个成员共享同一个内存
    所以你给其中一个成员赋值,其他成员就都有值了
    联合体本来就是用来做类型转换用的,最常见的用法就是把int拆成4个byte之类的
    这里是把short拆成char,或者反过来把2个char合并成short
    你这里想要输出,要循环数组按%d输出,不要按字符串输出
    按字符串输出是将char全部按ascii码变成字符,而1和2没有对应的字符,是不可见的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月20日
  • 已采纳回答 7月12日
  • 创建了问题 6月13日