为什么将一个char数组转换为int指针并使用指针写入它使数据反转?

时间:2015-05-22 23:05:45

标签: c++ c arrays pointers

我创建了一些简单的代码来测试将char数组转换为int指针。这正如我预期的那样工作正常,但是当我使用指针写入数组时,当我打印出c数组时,数据交换了MSB< - > LSB。为什么会这样?这是操作系统依赖的吗?

#include "stdio.h"

const int SIZE = 12;

int _tmain(int argc, _TCHAR * argv[]) {
    unsigned char c[SIZE] = {
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
    };
    unsigned int * ptr = (unsigned int * ) c;
    int i;

    printf("Int size=%d\n", sizeof(unsigned long));

    for (i = 0; i < sizeof(c); i++) {
        printf("%X, ", c[i]);
    }
    printf("\n\n");

    for (i = 0; i < sizeof(c) / sizeof(unsigned long); i++) { * ptr++ = i;
    }

    for (i = 0; i < sizeof(c); i++) {
        printf("%X, ", c[i]);
    }

    printf("\n");
    return 0;
}

这是输出:

Int size=4
1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C,
0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0,

3 个答案:

答案 0 :(得分:10)

您的架构是Little Endian,这意味着最低有效字节首先存储在内存中:

enter image description here

在你的情况下,0x00000001按[0x01,0x00,0x00,0x00]的顺序写入。

答案 1 :(得分:8)

这是由您的CPU架构endianness引起的。您的架构似乎little endian导致这种反转。

答案 2 :(得分:2)

  • 你很困惑,英语是Big-endian 注释即可。
  • 从左到右阅读。

例如:0xDead存储如

  0xD      0xE       0xA       0xD
0xADDR  0xADDR+1  0XADDR+2  0xADDR+3