指针是否指向 LSB 或 MSB



如果我有以下代码:

int i = 5;
void * ptr = &i;
printf("%p", ptr);

我会得到 i 或 MSB 的 LSB 地址吗?
它在不同平台之间的行为会有所不同吗?C 和 C++ 之间有区别吗?

考虑int的大小是 4 个字节。始终&i会为您提供这 4 个字节的第一个地址。

如果体系结构是小端序,则较低的地址将具有如下所示的LSB。

       +------+------+------+------+地址 |1000 |1001 |1002 |1003 |        +------+------+------+------+价值 |  5 |   0 |   0 |   0 |        +------+------+------+------+

如果体系结构是大端序,则较低的地址将具有如下所示的MSB。

       +------+------+------+------+地址 |1000 |1001 |1002 |1003 |        +------+------+------+------+价值 |  0 |   0 |   0 |   5 |        +------+------+------+------+

因此,如果小端序,&i将给出i的LSB地址,或者如果大端序,它将给出i的MSB地址

在混合字节序模式下,将为每个任务动态选择小端或大端。

下面的逻辑会告诉你 endia

int i = 5; 
void * ptr = &i; 
char * ch = (char *) ptr;
printf("%p", ptr); 
if (5 == (*ch))
    printf("nlittle endiann");
else
    printf("nbig endiann");

此行为对于cc++都是相同的

我会得到 i 或 MSB 的 LSB 地址吗?

这取决于平台:它将是最低寻址字节,可能是 MSB 或 LSB,具体取决于平台的字节序

虽然这没有直接写在标准中,但这是第 6.3.2.3.7 节所暗示的:

当指向对象的指针转换为指向字符类型的指针时,结果将指向对象的最低寻址字节。


它在不同平台之间的行为会有所不同吗?

是的


C 和 C++ 之间有区别吗?

否:它在 C 和 C++ 中都依赖于平台

这取决于平台的字节序;如果它是一个小端平台,你会得到一个指向LSB的指针,如果它是一个大端平台,它将指向MSB。甚至还有一些混合端序平台,在这种情况下,愿上帝怜悯你的灵魂检查你的编译器/CPU 的具体文档。

不过,您可以在运行时执行快速检查:

uint32_t i=0x01020304;
char le[4]={4, 3, 2, 1};
char be[4]={1, 2, 3, 4};
if(memcmp(&i, le, 4)==0)
    puts("Little endian");
else if(memcmp(&i, be, 4)==0)
    puts("Big endian");
else
    puts("Mixed endian");

顺便说一下,要打印指针,您必须使用%p占位符,而不是 %d .

ptr 存储整数对象起始字节的地址。这是存储最高或最低有效字节的位置取决于您的平台。一些奇怪的平台甚至使用混合字节序,在这种情况下,它既不是MSB也不是LSB。

在这方面,C 和 C++ 之间没有区别。

它指向的是我的VC++ 2010和Digital Mars的MSB。但它与字节序有关。

这个问题的答案为您提供了一些信息:在C++程序中以编程方式检测字节序。

在这里,用户"无"说:

#define BIG_ENDIAN      0
#define LITTLE_ENDIAN   1
 int TestByteOrder()
{
   short int word = 0x0001;
   char *byte = (char *) &word;
   return(byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN);
}

这提供了一些字节序信息

好吧,我得到 i 或 MSB 的 LSB 地址?

这取决于机器和操作系统。 在大端机器和操作系统上,您将获得MSB,在小端序机器和操作系统上,您将获得LSB。

Windows总是小端序。 x86上所有(大多数?)Linux/Unix版本都是小端序。 摩托罗拉机器上的Linux/Unix是大端序。x86机器上的Mac OS是小端序。 在PowerPC机器上,它是大端序。

那么它在平台之间的行为不同吗? 是的,会的。

C 和 C++ 之间有区别吗? 应该不会。

最新更新