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

时间:2013-04-26 02:51:12

标签: c++ c endianness

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

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

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

char *c = (char *)&i;

什么被存储到指针c ..我包含的值或实际地址i包含在?另外,为什么这个节目的焦点呢?

2 个答案:

答案 0 :(得分:10)

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

00000011 00000000  00000000  00000000

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

00000000  00000000  00000000  00000011

因此,在第一种情况下,char*会解释第一个字节并显示3,但在第二种情况下会显示0

如果你没有把它作为:

char *c = (char *)&i;

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

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

警告!! OP,我们讨论了little-endianbig-endian之间的区别,但更重要的是要了解little-endian和{{1}之间的区别我注意到你使用了后者。好吧,区别在于little-indian如果你的面试官是little-indianNikesh Arora,Sundar Pichai,Vinod Dham or Vinod Khosla可能会让你失去你在谷歌的梦想工作或300万美元的风险投资:-)

答案 1 :(得分:4)

让我们试着通过这个:(在评论中)

int main(void){ /
  unsigned int i = 1;    // i is an int in memory that can be conceptualized as 
                         // int[0x00 00 00 01]

  char *c = *(char *)&i; // We take the address of i and then cast it to a char pointer
                         // which we then dereference. This cast from int(4 bytes) 
                         // to char(1 byte) results in only keeping the lowest byte by
  if(*c){                // Endian-ness. 
    puts("little!\n");   // This means that on a Little Endian machine, 0x01 will be 
  } else {               // the byte kept, but on a Big Endian machine, 0x00 is kept.
    puts("big!\n");      // int[0x00 00 00 (char)[01]]  vs  int[0x01 00 00 (char)[00]]
  }

  return 0;
}