为什么当将 short[] 转换为字符*时,数组是反转的?
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
有人可以向我解释一下这是如何工作的吗?
表达式( '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* 使得编译器将数组解释为字符串(只是一个字符数组),然后您获得该输出
相关文章:
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 按字符值访问int数组
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- C++ 带结构的数组字符
- 数组字符包含量超出预期
- 读取文件并添加到数组字符
- 如何在Qt中更改或替换数组字符
- 为什么编译器不在参数中传递数组字符 *arr[] 的大小?
- 井字棋数组字符错误
- 分割数组字符