2013-04-26 61 views
2

我试图寻找一个代码,以确定该系统的字节序,这是我发现:代码找到字节序指针类型转换

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; 

什么是越来越存入指针ç..我包含值或者我被包含在实际的地址?此外,为什么这是这个程序的字符?

+6

uuhhh,这是行不通的。然而,它会工作,如果'我'被分配到1我认为... – David 2013-04-26 02:55:45

+0

@Dave我也有点怀疑,但是我再也不真正了解一些黑魔法人的想法。 – michaelb958 2013-04-26 02:57:45

+6

Endian,而不是印度 – franji1 2013-04-26 02:59:07

回答

10

虽然解引用字符指针,只有一个字节被解释(假设一个char变量取一个字节)。而在little-endian模式,一个整数的least-significant-byte存储first.So为4字节整数,比如3,而对于big-endian模式被存储,因为它被存储为

00000011 00000000 00000000 00000000 

00000000 00000000 00000000 00000011 

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

如果你不是一个类型强制转换它:

char *c = (char *)&i; 

它会显示一个关于不兼容的指针警告type.Had c是一个integer pointer,提领它会得到一个整数值3不管字节序的,因为所有4字节将被解释。

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

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

+1

我的不好,我从一个网站复制它,并没有仔细看过这一切..我是对类型转换比对printf中写入的内容更感兴趣。不过,请纠正它,谢谢! – Floose 2013-04-26 03:59:29

+0

@Floose嘿,我只是在开玩笑。这只是一个无辜的拼写错误,并不意味着这个程序太多! – 2013-04-26 04:00:29

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; 
} 
+1

嘿,非常感谢您的回复。不幸的是,我只能将一个答案标记为正确,所以这里是我感谢您的帮助。我现在很清楚。给你一个upvote :) – Floose 2013-04-26 03:58:18

+1

描述是不准确的 - 没有“downcasting”(该术语是指非常具体的东西;请不要像这样超载)。 '&i'符号取变量'i'的地址:即它给你一个指向'unsigned int'的指针。然后,您将该指针转换为指向'char'的指针。 if语句中的* c *将引用该字符指针,根据代码运行平台的字节顺序返回整数的LSB或MSB。 – 2013-04-26 04:06:22

+0

我的歉意@Nik Bougalis,我修改了我的答案。 – GRAYgoose124 2013-04-26 13:09:32