C中通过引用32/64位时的端性问题

C中通过引用32/64位时的端性问题,c,endianness,C,Endianness,在下面的例子中,我正在努力解决一个endianness问题。 在这个函数中,main()传递32位整数的地址,myfunc()接收64位整数的地址 #include <stdint.h> #include <stdio.h> void myfunc(uint64_t *b) { printf("%llx\n", *b); if ((*b & 255) == 127) printf("\n It works\n");

在下面的例子中,我正在努力解决一个endianness问题。 在这个函数中,main()传递32位整数的地址,myfunc()接收64位整数的地址

#include <stdint.h>
#include <stdio.h>

void myfunc(uint64_t *b)    
{    
    printf("%llx\n", *b);    
if ((*b & 255) == 127)    
   printf("\n It works\n");    
else    
    printf("\n Not working\n");    
}

main()    
{    
uint32_t a = 127;    
    printf("\n%lx\n", a);
    myfunc(&a);
}
它起作用了

但它在big-endian(AIX)上失败

不起作用

我认为当我们传递32位的地址并在64位接收时,在big-endian平台上它会在其他32位接收。但我不确定。 请帮助我了解这背后发生了什么。我不能正确地在这里写第一行程序

非常感谢

Ann

首先,您可以编写触发未定义行为的代码。您分配一个32位变量
a
,然后(在
myfunc()
中)尝试使用它,就好像它是64位的大变量一样,这样您就可以有效地尝试访问合法分配的变量之外的变量。这可能会导致任何后果,并且您的程序无法正常工作,因为从C标准的角度来看,您尝试执行的操作毫无意义。

首先,您编写的代码会触发未定义的行为。您分配一个32位变量
a
,然后(在
myfunc()
中)尝试使用它,就好像它是64位的大变量一样,这样您就可以有效地尝试访问合法分配的变量之外的变量。这可能会导致任何后果,您的程序无法正常运行,因为从C标准的角度来看,您试图做的事情毫无意义。

Wovv!太酷了。论坛自动包含了stdio.h文件,并更正了stdint.h的语法(我之前做不到)。不,sleske编辑了你的帖子以更正格式。不幸的是,降价软件还没有那么聪明。当你编辑你的文章时,右边有一些说明,解释了如何格式化代码。你所要做的就是每行缩进至少4个空格。您也可以选择全部,然后单击工具栏中的
{}
按钮,该按钮将自动将块格式化为代码。您可以感谢sleske所做的工作。:)谢谢你的信息。谢谢你!太酷了。论坛自动包含了stdio.h文件,并更正了stdint.h的语法(我之前做不到)。不,sleske编辑了你的帖子以更正格式。不幸的是,降价软件还没有那么聪明。当你编辑你的文章时,右边有一些说明,解释了如何格式化代码。你所要做的就是每行缩进至少4个空格。您也可以选择全部,然后单击工具栏中的
{}
按钮,该按钮将自动将块格式化为代码。您可以感谢sleske所做的工作。:)谢谢你的信息。谢谢,但我们可以将小尺寸变量的值赋给大尺寸变量。在上述情况下,如果我们按值传递,它将正常工作。只有在big endian机器上通过引用时才会出错。谢谢,@user646403:是的,当您传递值时可以这样做。但当您通过引用传递时,会触发未定义的行为。它恰好产生了您在LE上期望的结果。因此,如果您有时间,请您在上面的代码中向我解释字节是如何在big-endian和little-endian平台上存储/传递/接收的。@user646403:在LE上,较低的位存储在较低的地址上,在BE-存储在较高的地址上。因此,在LE上,32位和64位变量的低位将驻留在第一个字节中,当您尝试您的技巧时,被调用的代码将从“变量”的初始化部分读取。在BE上,64位变量的低位将存储在“变量开始+8字节”地址,但32位变量的低位将存储在“变量开始+4字节”地址,因此调用的代码将尝试从“变量”的未初始化部分读取在99.9%的情况下,CPU地址空间中的地址恰好满足了C指针的要求,因此大多数实现使用内存地址作为指针值。但它们也可以使用一些查找值由运行时系统进行转换,但我们可以将小变量的值分配给大变量。在上述情况下,如果我们按值传递,它将正常工作。只有在big endian机器上通过引用时才会出错。谢谢,@user646403:是的,当您传递值时可以这样做。但当您通过引用传递时,会触发未定义的行为。它恰好产生了您在LE上期望的结果。因此,如果您有时间,请您在上面的代码中向我解释字节是如何在big-endian和little-endian平台上存储/传递/接收的。@user646403:在LE上,较低的位存储在较低的地址上,在BE-存储在较高的地址上。因此,在LE上,32位和64位变量的低位将驻留在第一个字节中,当您尝试您的技巧时,被调用的代码将从“变量”的初始化部分读取。在BE上,64位变量的低位将存储在“变量开始+8字节”地址,但32位变量的低位将存储在“变量开始+4字节”地址,因此调用的代码将尝试从“变量”的未初始化部分读取在99.9%的情况下,CPU地址空间中的地址恰好满足了C指针的要求,因此大多数实现使用内存地址作为指针值。但它们也可以使用一些查找值由运行时系统进行转换。
7f
28ff780000007f
7f
7fdeadbeef