指针指向LSB或MSB吗?

时间:2012-08-16 10:38:07

标签: c++ c pointers void-pointers

如果我有以下代码:

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

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

6 个答案:

答案 0 :(得分:17)

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

如果架构是小端,那么较低的地址将具有如下的LSB。

        +------+------+------+------+
Address | 1000 | 1001 | 1002 | 1003 |
        +------+------+------+------+
Value   |   5  |    0 |    0 |    0 |
        +------+------+------+------+

如果架构是大端,那么较低的地址将具有如下的MSB。

        +------+------+------+------+
Address | 1000 | 1001 | 1002 | 1003 |
        +------+------+------+------+
Value   |   0  |    0 |    0 |    5 |
        +------+------+------+------+

所以如果是小端,&i会给出i的LSB地址,如果是大端,它会给出i的MSB地址

在混合端模式中,也会动态地为每个任务选择小端或大端。

下面的逻辑将告诉你endianess

int i = 5; 
void * ptr = &i; 
char * ch = (char *) ptr;

printf("%p", ptr); 
if (5 == (*ch))
    printf("\nlittle endian\n");
else
    printf("\nbig endian\n");

cc++

的行为相同

答案 1 :(得分:8)

  

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

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

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

  

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


  

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


  

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

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

答案 2 :(得分:8)

这取决于平台的字节顺序;如果它是一个小端平台,你会得到一个指向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

答案 3 :(得分:5)

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

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

答案 4 :(得分:3)

我的VC ++ 2010和Digital Mars的MSB指出了什么。但它与字节序有关。

这个问题的答案为您提供了一些信息: Detecting endianness programmatically in a C++ program

此处,用户“无”说:

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

这给出了一些字节序信息

答案 5 :(得分:1)

  
    

我得到了i的LSB地址,还是MSB?

  

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

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

  
    

它在平台之间的行为有何不同?     是的,它会。

         

c和c ++之间有区别吗?     可能不是。