查找字节序指针类型转换的代码

问题描述 投票:0回答: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;

指针 c 中存储的是什么? i 包含的值或 i 包含的实际地址?另外为什么这是这个程序的一个字符?

c++ c endianness
2个回答
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;

它会显示有关不兼容指针类型的警告。如果

c
integer pointer
,则取消引用它会得到一个整数值
3
,而不管 endianness,因为所有四个字节都将被解释。

NB:您需要初始化变量

i
才能看到全貌。否则,默认情况下,垃圾值将存储在变量中。

警告!!OP,我们讨论了little-endianbig-endian之间的区别,但更重要的是了解little-endian和little-indian之间的区别。我注意到你使用了后者。好吧,区别在于,如果你的面试官是 Nikesh Arora、Sundar Pichai、Vinod Dham 或 Vinod Khosla,那么“小印度人”可能会让你失去在 Google 的理想工作或 300 万美元的风险投资 :-)


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

© www.soinside.com 2019 - 2024. All rights reserved.