用于查找Endianness指针类型转换的代码

Flo*_*ose 2 c c++ endianness

我试图搜索一个代码来确定系统的字节顺序,这就是我发现的:

int main()
{
    unsigned int i= 1;
    char *c = (char *)&i;
    if (*c) {
        printf("Little Endian\n");
    } else {
        printf("Big Endian\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

有人能告诉我这段代码是如何工作的吗?更具体地说,为什么在这个类型转换中需要&符号:

char *c = (char *)&i;
Run Code Online (Sandbox Code Playgroud)

什么被存储到指针c ..我包含的值或实际地址i包含在?另外为什么这个程序的字符?

Rüp*_*ure 10

解除引用字符指针时,只解释一个字节(假设char变量占用一个字节).在little-endian模式下,least-significant-byte首先存储一个整数.所以对于一个4字节的整数,比如3,它存储为

00000011 00000000  00000000  00000000
Run Code Online (Sandbox Code Playgroud)

而对于big-endian模式,它存储为:

00000000  00000000  00000000  00000011
Run Code Online (Sandbox Code Playgroud)

所以在第一种情况下,char* 解释第一个字节并显示,3但在第二种情况下显示0.

如果你没有把它作为:

char *c = (char *)&i;
Run Code Online (Sandbox Code Playgroud)

它会显示一个关于不兼容指针类型的警告.如果cinteger pointer,则取消引用它将得到一个整数值3而不管字节顺序,因为所有4个字节都将被解释.

注意您需要初始化变量i以查看整个图片.默认情况下,垃圾值存储在变量中.

警告!!OP,我们讨论的区别little-endianbig-endian,但要知道的区别是更重要little-endianlittle-indian.我注意到,您使用的latter.Well,不同之处在于little-indian可以花费你你梦想的工作在谷歌或如果$ 300万风险投资你的面试官是Nikesh Arora,Sundar Pichai,Vinod Dham or Vinod Khosla:-)