c++ - 查找字节顺序指针类型转换的代码

标签 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 包含的值或包含 i 的实际地址?还有为什么这个程序是一个字符?

最佳答案

当取消引用一个字符指针时,只有一个字节被解释(假设一个char变量占用一个字节)。在little-endian模式下,最少-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 无论如何字节顺序,因为所有 4 个字节都将被解释。

注意您需要初始化变量i才能看到全貌。否则默认情况下变量中存储了垃圾值。

Warning!! OP,我们讨论了 little-endianbig-endian 之间的区别,但更重要的是了解它们的区别在 little-endianlittle-indian 之间。我注意到你使用的是后者。嗯,区别在于 little-indian 可能会花费你如果你的面试官是 Nikesh Arora、Sundar Pichai、Vinod Dham 或 Vinod Khosla :-)

,你在 Google 的理想工作或 300 万美元的风险投资

关于c++ - 查找字节顺序指针类型转换的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16227972/

相关文章:

c++ - 以毫秒为单位捕获时间

c - 将新数据读取到函数内的指针参数中?

c++ - 在 C、C++ 中控制 Windows 服务

C float 每次执行都会改变 %d 个值

arm - ARM中的字节序转换

javascript - 在 JavaScript 中打包二进制数据

c - 移位是否取决于字节序?

c++ - 如何在c/c++中复制结构?

c++ - 在 C++ 中将智能指针放入类数据(作为类成员)的正确方法是什么?

c++ - 在 Linux 上快速高效地绘制像素阵列