有人可以向我解释这是如何工作的

时间:2019-06-14 13:36:14

标签: c pointers

我在C语言期末考试中看到了这个问题,输出为513,我不知道为什么

#include <stdio.h>
int main(void){
    char a[4] = {1,2,3,4};
    print("%d" , *(short*)a);
}

3 个答案:

答案 0 :(得分:7)

您的字节数组为(十六进制):

[ 0x01, 0x02, 0x03, 0x04 ]

如果您将数组的开头不视为字节数组,而是视为short的开头,则您的short的值为0x01 0x02,并且因为您的处理器为{{3} },它从人类的阅读方式开始向后读取。我们将其命名为0x0201,与513(Decimal)

相同

答案 1 :(得分:4)

如果运行此代码的系统满足以下要求:

  • 允许未对齐的内存访问(或保证a对齐short

  • 使用小尾数字节顺序

  • sizeof(short) == 2

  • CHAR_BIT == 8

然后取消引用short *指针指向以下存储器:

|  0x01  |  0x02  |  0x03  |  0x04  |

将以10为底的数字给您0x0201513

还要注意,即使满足所有这些要求,将char []数组别名为short *也会违反strict aliasing rule

答案 2 :(得分:1)

代码将您的char*指针转换为short*并输出其值。

C中的

short表示为2个字节,数组的前两个字节的二进制表示为00000001 00000010,但是由于处理器是小端的,因此将其读取为00000010 00000001,即十进制513。