为什么,当将一个short []转换为char *时,数组是否反转了?

时间:2018-01-22 01:04:42

标签: c++ casting char endianness short

以下代码:

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

输出结果为:

  

ABCDEFG

有人可以向我解释一下这种方法的运作方式吗?

2 个答案:

答案 0 :(得分:4)

短是16位,char是8。 所以一个短句可以包含两个字符。

( 'B' << 8 ) + 'A'部分将'B'的值移位8位并将其添加到A.所以现在短的每一半都保持不同字符的ASCII码。在这种情况下A和B.

将它转换为char *现在使得编译器将数组解释为字符串(这只是一个字符数组)并获得该输出

答案 1 :(得分:4)

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

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

您描述的输出表明您的主机架构是小端的。

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

注意:为了便于讨论,我忽略了所显示的代码具有未定义的行为这一事实。接受<<的流媒体运营商char *假定存在值char的终止'\0'。您的代码无法确保终结符存在。