c++ - 为什么在将 short[] 转换为 char* 时数组会反转?

标签 c++ casting char endianness short

对于下面的代码:

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'将在最左边。

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

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

注意:为了便于讨论,我忽略了您的代码具有未定义行为这一事实。流媒体运营商<<它接受 char *假设存在终止 char具有值(value) '\0' .您的代码不能确保存在终止符。

关于c++ - 为什么在将 short[] 转换为 char* 时数组会反转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48373426/

相关文章:

c++ - 如何存储对象供以后使用并使它们可搜索

c++ - 最有可能使用什么方法来处理多个键以使用 STL 容器获取值?

C++:包含内包含

c - "initialization makes integer from pointer without a cast"数组初始化中逐渐减弱

c++ - 使用 char[] 创建字符串

python - 无法在 Ubuntu 的 Python 中导入 FANN

java - 为什么数组赋值不兼容,即使它们的数据类型是兼容的?

python - 字节从 py2 到 py3 的行为变化

c# - List<T> 转换算法和性能注意事项

c - 想要将 "char values"存储在数组中(C语言)