[英]Why does casting a char array to an int pointer and writing to it using the pointer make the data reversed?
[英]Why, when casting a short[] to char* is the array reversed?
对于以下代码:
short shortArray [] = { ( 'B' << 8 ) + 'A', ( 'D' << 8 ) + 'C', ( 'F' << 8 ) +
'E', 'G' };
cout << (char*)shortArray;
输出是:
ABCDEFG
有人能解释一下这种方法的运作方式吗?
short是16位,char是8.因此一个short可以包含两个字符。
( 'B' << 8 ) + 'A'
部分将'B'的值移位8位并将其加到A.所以现在短的每一半都保持不同字符的ASCII码。 在这种情况下A和B.
将它转换为char *现在使得编译器将数组解释为一个字符串(它只是一个字符数组)并且你得到了输出
表达式( 'B' << 8 ) + 'A'
具有int
类型的结果,将等于'B'*256 + 'A'
。
当转换为short
(假设short
表示为两个8位字节)时,该值由字节对AB
,其中A
是最低有效字节。 在小端机器上,最低有效字节首先出现在内存中(即'A'
是最左边的,下一个字节是'B'
)。 在大端机器上, 'B'
将是最左边的。
您描述的输出表明您的主机架构是little-endian。
英特尔处理器都是小端的。 从历史上看,包括摩托罗拉68000系列处理器,PowerPC和Sparc(来自Sun Microsystems)在内的一系列CPUS都是大端的。 网络字节顺序(用于通过网络传输数据)是big-endian。
注意:为了便于讨论,我忽略了您所显示的代码具有未定义行为的事实。 流接入运算符<<
接受char *
假定存在值为'\\0'
的终止char
。 您的代码无法确保存在终结符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.