首页 文章

有人可以为我解释这个“endian-ness”功能吗?

提问于
浏览
11

编写程序以确定计算机是big-endian还是little-endian .

bool endianness() {
     int i = 1;
     char *ptr;
     ptr  = (char*) &i;
     return (*ptr);
}

所以我有上面的功能 . 我真的不明白 . ptr =(char *)&i,我认为这意味着指向我所在地址的字符的指针,所以如果一个int是4个字节,比如ABCD,当你调用char *时,我们是在讨论A或D. ?为什么?

有人请更详细地解释一下吗?谢谢 .

具体来说,ptr =(char *)&i;当你把它投到char *时,我得到了什么?

6 回答

  • 33

    假设int是4个字节(在C中它可能不是) . 这个假设只是为了简化示例......

    您可以分别查看这4个字节中的每个字节 .

    char 是一个字节,所以它正在查看4字节缓冲区的第一个字节 .

    如果第一个字节为非0,那么它会告诉您第一个字节中是否包含最低位 .

    我随机选择了数字42,以避免在值1中混淆任何特殊含义 .

    int num = 42;
    if(*(char *)&num == 42)
    {
          printf("\nLittle-Endian\n");
    }
    else
    {
          printf("Big-Endian\n");
    }
    

    Breakdown:

    int num = 42; 
    //memory of the 4 bytes is either: (where each byte is 0 to 255)
    //1) 0 0 0 42
    //2) 42 0 0 0
    
    char*p = #/*Cast the int pointer to a char pointer, pointing to the first byte*/
    bool firstByteOf4Is42 = *p == 42;/*Checks to make sure the first byte is 1.*/
    
    //Advance to the 2nd byte
    ++p;
    assert(*p == 0);
    
    //Advance to the 3rd byte
    ++p;
    assert(*p == 0);
    
    //Advance to the 4th byte
    ++p;
    bool lastByteOf4Is42 = *p == 42;
    assert(firstByteOf4Is42 == !lastByteOf4Is42);
    

    如果firstByteOf4Is42为真,你就有了小端 . 如果lastByteOf4Is42为true,那么你有big-endian .

  • 1

    *((char*)&i) 是字节A还是字节D是否是字节序的核心 . 在小端系统上,整数0x41424344将在内存中布局为:0x44 43 42 41(最低有效字节优先;在ASCII中,这是"DCBA") . 在大端系统上,它将被布置为:0x41 42 43 44.指向此整数的指针将保存第一个字节的地址 . 将指针视为整数指针,并获得整数 . 将指针视为char指针,然后得到第一个字节,因为这是char的大小 .

  • 0

    当然,

    让我们来看看

    bool endianness() {
         int i = 1; //This is 0x1:
         char *ptr;
         ptr  = (char*) &i; //pointer to 0001
         return (*ptr);
    }
    

    如果机器是Little endian,则数据将在* ptr中为0000 0001 .

    如果机器是Big Endian,那么数据将被反转,也就是说,我将是

    i = 0000 0000 0000 0001 0000 0000 0000 0000
    

    所以* ptr将保持0x0

    最后,return * ptr相当于

    if (*ptr = 0x1 ) //little endian
    
    else //big endian
    
  • 2

    如果 ptr 指向字节A或D取决于机器的字节顺序 . ptr 指向位于最低地址的整数的字节(其他字节位于 ptr+1 ,...) .

    在大端机器上,整数的最高有效字节(即 0x00 )将存储在该最低地址,因此该函数将返回零 .

    在litte-endian机器上相反,整数( 0x01 )的最低有效字节将存储在最低地址,因此在这种情况下函数将返回一个 .

  • 0

    这是使用类型punning来访问整数作为字符数组 . 如果机器是大端,这将是主要字节,并且将具有零值,但如果机器是小端,则它将是次要字节,其值为1 . (不是将 i 作为单个整数访问,而是将相同的内存作为四个字符的数组进行访问) .

  • 0

    如果你有一个小端架构, i 在内存中会是这样的(十六进制):

    01 00 00 00
    ^
    

    如果你有一个big-endian架构, i 在内存中会是这样的(十六进制):

    00 00 00 01
    ^
    

    转换为 char* 给你一个指向int的第一个字节的指针(我用 ^ 指向),所以 char* 指向的值将是 01 ,如果你是一个小端架构, 00 如果你是一个大端架构 .

    返回该值时, 0 将转换为 false1 将转换为 true . 所以,如果你有一个little-endian架构,这个函数将返回 true ,如果你有一个big-endian架构,它将返回 false .

相关问题