这是在考试中作为过去的问题给出的,但我无法理解最后4个printf函数的结果。我得到了前2个字符到十六进制的转换,但是我不知道

ptr[0] to ptr[3]

这是编译和运行的代码部分。
int main(int argc, char *argv[]){

    typedef unsigned char byte;

    unsigned int nines = 999;
    byte * ptr = (byte *) &nines;

    printf ("%x\n",nines);
    printf ("%x\n",nines * 0x10);
    printf ("%d\n",ptr[0]);
    printf ("%d\n",ptr[1]);
    printf ("%d\n",ptr[2]);
    printf ("%d\n",ptr[3]);

    return EXIT_SUCCESS;
}

这是相应的输出
3e7
3e70
231
3
0
0

最佳答案

当您执行byte * ptr = (byte *) &nines;时,您将ptr的地址设置为与nines相同的地址。其值为999,十六进制为0x3e7
从这个问题出发,我假设int有4个字节,这是一个小的endian系统。即字节是这样存储的。

---------------------------------
| 0xe7  |  0x03 |  0x00 |  0x00 |
---------------------------------
  ptr     ptr+1   ptr+2    ptr+3

所以当你打印出来的时候,你会得到231300的值(231等于0xe7)
在little-endian系统中,继intel处理器和大多数微控制器之后,最低有效字节先存储,最高有效字节后存储。
另一方面,我们有big-endian系统,接着是一些老式的Motorola控制器和power PC,其中最重要的字节首先存储。这些系统的输出是0、0、3和231。

09-04 18:09