我试图搜索一个代码来确定系统的字节顺序,这就是我发现的:
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包含在?另外,为什么这个节目的焦点呢?
答案 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 c
是integer pointer
,取消引用它将获得整数值3
而不管字节顺序如何,因为所有4个字节都将是解释
NB 您需要初始化变量i
以查看整个图片。默认情况下,垃圾值会存储在变量中。
警告!! OP,我们讨论了little-endian
和big-endian
之间的区别,但更重要的是要了解little-endian
和{{1}之间的区别我注意到你使用了后者。好吧,区别在于little-indian
如果你的面试官是little-indian
:Nikesh 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;
}