【问题标题】:Why, when casting a short[] to char* is the array reversed?为什么,当将 short[] 转换为 char* 时,数组会反转?
【发布时间】:2018-06-30 14:28:00
【问题描述】:

对于以下代码:

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

输出是:

ABCDEFG

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

【问题讨论】:

  • 研究课题——字节序
  • 反对者 - 解释一下。

标签: c++ casting char endianness short


【解决方案1】:

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

( 'B' &lt;&lt; 8 ) + 'A' 部分将“B”的值移动 8 位并将其添加到 A。所以现在短的每一半都包含不同字符的 ASCII 码。在这种情况下,A 和 B。

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

【讨论】:

  • 最后一个字符后跟一个零字节也很重要。而且,代码不可移植,在其他平台上会产生不同的输出。
  • shortchar通常分别为 16 位和 8 位。而且你没有提到字节顺序,这是 OP 所要求的。
【解决方案2】:

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

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

您描述的输出表明您的主机架构是 little-endian。

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

注意:为了便于讨论,我忽略了您的代码所示行为未定义的事实。接受 char * 的流式操作符 &lt;&lt; 假定存在具有值 '\0' 的终止 char。您的代码不能确保存在终止符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2015-01-20
    • 2017-08-17
    • 1970-01-01
    相关资源
    最近更新 更多