为什么当将 short[] 转换为字符*时,数组是反转的?

Why, when casting a short[] to char* is the array reversed?

本文关键字:数组 字符 short 转换 为什么      更新时间:2023-10-16

对于以下代码:

short shortArray [] = { ( 'B' << 8 ) + 'A', ( 'D' << 8 ) + 'C', ( 'F' << 8 ) + 
'E', 'G' };
cout << (char*)shortArray;

输出为:

ABCDEFG

有人可以向我解释一下这是如何工作的吗?

表达式( 'B' << 8 ) + 'A'的结果类型为int,将等于'B'*256 + 'A'

当转换为short时(假设一个short表示为两个8位字节),此值由AB的字节对表示,其中A是最低有效字节。 在小端计算机上,最低有效字节首先出现在内存中(即'A'最左边,下一个字节'B')。 在大端机器上,'B'将位于最左侧。

您描述的输出表明您的主机体系结构是小端序的。

英特尔处理器都是小端序。 从历史上看,包括摩托罗拉68000系列处理器,PowerPC和Sparc(来自Sun Microsystems)在内的一系列CPU都是大端序的。 网络字节顺序(用于通过网络传输数据)是大端序。

注意:为了讨论起见,我忽略了所示代码具有未定义行为的事实。 接受char *的流运算符<<假定存在值为''的终止char。 您的代码无法确保终止符存在。

short 是 16 位,char 是 8。 所以一个短片可以容纳两个字符。

( 'B' << 8 ) + 'A'部分将"B"的值移动 8 位并将其添加到 A。所以现在短裤的每一半都保存着不同字符的 ASCII 代码。在本例中为 A 和 B。

现在将其转换为 char* 使得编译器将数组解释为字符串(只是一个字符数组),然后您获得该输出