0

我写了一段代码来确定我的系统的字节顺序。但是输出让我感到困惑。

...
    int a = 0x12345678;
    uint8_t c0, c1, c2, c3;

    c0 = *( (uint8_t *)&a   );
    c1 = *( (uint8_t *)&a+1 );
    c2 = *( (uint8_t *)&a+2 );
    c3 = *( (uint8_t *)&a+3 );

    /* Print addresses of all the variables. */
...

输出:

&a : 0xbf9b23f8  
&c0: 0xbf9b23fc   // &c0 - &a = 4, Why &a != &c0 ? 
&c1: 0xbf9b23fd    
&c2: 0xbf9b23fe    
&c3: 0xbf9b23ff

如果我评论一些陈述,偏移量会有所不同。

...
    int a = 0x12345678;
    uint8_t c0;

    c0 = *( (uint8_t *)&a   );
...

输出:

&a : 0xbf893788
&c0: 0xbf89378f    // &c0 - &a = 7 ??
4

3 回答 3

1

我可以建议一个更简单的方法吗?

int a=0x01234567;
unsigned char *c;
c = (unsigned char*)(&a);
for(int i=0; i<4; i++) {
  printf("byte %d = %02x\n", i, c[i]);
}

但是要回答您的基本问题-当您将变量设置c0为的第一个字节的值时a,这并不意味着它们共享相同的地址...

始终使您的代码尽可能简单,但不要更简单。

于 2013-10-22T10:14:00.207 回答
0

您正在打印变量的地址。为什么你期望地址改变?它包含从另一个变量的部分地址复制的数据,但 c0 到 c3 的地址与您使用它们的算法之间没有关系(打印a每个字节的地址)。

&c0 - &a = 4,为什么是 &a != &c0 ?

因为它们是不同的变量。

如果我评论一些陈述,偏移量会有所不同。

编译器可以随意在堆栈上分配对象。您无法提前知道变量将如何或在何处分配到堆栈上。编译器很可能会尝试在堆栈帧中正确对齐您的变量。

于 2013-10-22T11:22:06.193 回答
0

只是在你的源代码中修改了一些东西,

#include <stdio.h>
#include <stdint.h>  // for uint8_t
#include <stdlib.h>

int main(void)
{
    int a = 0x12345678;
    uint8_t *c0, *c1, *c2, *c3; // Changed to pointers

    c0 = (uint8_t *)&a;      //address is stored
    c1 = (uint8_t *)&a+1;
    c2 = (uint8_t *)&a+2;
    c3 = (uint8_t *)&a+3;

    printf("&a : %p\n", (void *)&a );
    printf("&c0: %p\n", (void *)c0);
    printf("&c1: %p\n", (void *)c1);
    printf("&c2: %p\n", (void *)c2);
    printf("&c3: %p\n", (void *)c3);
    exit(0);
}

输出:

&a : 0022FF34
&c0: 0022FF34
&c1: 0022FF35
&c2: 0022FF36
&c3: 0022FF37
于 2013-10-22T10:30:57.563 回答