这是在考试中作为过去的问题给出的,但我无法理解最后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
所以当你打印出来的时候,你会得到
231
,3
,0
和0
的值(231等于0xe7)在little-endian系统中,继intel处理器和大多数微控制器之后,最低有效字节先存储,最高有效字节后存储。
另一方面,我们有big-endian系统,接着是一些老式的Motorola控制器和power PC,其中最重要的字节首先存储。这些系统的输出是0、0、3和231。