我在C语言期末考试中看到了这个问题,输出为513,我不知道为什么
#include <stdio.h>
int main(void){
char a[4] = {1,2,3,4};
print("%d" , *(short*)a);
}
答案 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为底的数字给您0x0201
或513
。
还要注意,即使满足所有这些要求,将char []
数组别名为short *
也会违反strict aliasing rule。
答案 2 :(得分:1)
代码将您的char*
指针转换为short*
并输出其值。
short表示为2个字节,数组的前两个字节的二进制表示为00000001 00000010
,但是由于处理器是小端的,因此将其读取为00000010 00000001
,即十进制513。