以下代码:
short shortArray [] = { ( 'B' << 8 ) + 'A', ( 'D' << 8 ) + 'C', ( 'F' << 8 ) +
'E', 'G' };
cout << (char*)shortArray;
输出结果为:
ABCDEFG
有人可以向我解释一下这种方法的运作方式吗?
答案 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'
。您的代码无法确保终结符存在。