用指针将Char表转换为short 我在C++开发中是新手,学习时我遇到了以下的步骤: char A[] {1,2,3,4,5,6,7,8}; std::cout << *((short*)A+2) << std::endl; output: 1541 chara[]{1,2,3,4,5,6,7,8}; std::cout

用指针将Char表转换为short 我在C++开发中是新手,学习时我遇到了以下的步骤: char A[] {1,2,3,4,5,6,7,8}; std::cout << *((short*)A+2) << std::endl; output: 1541 chara[]{1,2,3,4,5,6,7,8}; std::cout,c++,arrays,pointers,C++,Arrays,Pointers,它的作用: A衰减为数组第一个元素的char*。该指针被转换为short*。执行指针算法,将其移动到两个短字符的空间,然后取消对其的引用。当解释为short时,它指向的内存读作1541(00000101 00000110) 为什么不这样做: 这是未定义的行为。严格的别名禁止将一种类型的指针强制转换为另一种任意类型并访问对象。有些案件是合法的,但这不是其中之一 不能保证sizeof(short)==2。如果sizeof(short)==4,则该行的读数将超过数组的末尾 您得到的值取决于endian

它的作用:

A
衰减为数组第一个元素的
char*
。该指针被转换为
short*
。执行指针算法,将其移动到两个短字符的空间,然后取消对其的引用。当解释为
short
时,它指向的内存读作1541(
00000101 00000110

为什么不这样做:

  • 这是未定义的行为。严格的别名禁止将一种类型的指针强制转换为另一种任意类型并访问对象。有些案件是合法的,但这不是其中之一

  • 不能保证
    sizeof(short)==2
    。如果
    sizeof(short)==4
    ,则该行的读数将超过数组的末尾

  • 您得到的值取决于endianness

  • 从技术上讲,
    short
    值可能最终成为陷阱表示,但在实践中,我高度怀疑任何积分陷阱值是否存在于任何地方



  • 注意:在堆栈溢出问题上,包含类似于
    *(short*)a
    的行的向上投票/接受的答案数量惊人,但它仍然违反了严格的别名。

    作为初学者,请尝试
    std::cout,不要这样做。作为一个有经验的开发者,不要这么做。这是我在网上找到的摩托罗拉解决方案中的一个求职面试问题。这就是为什么C++有编译器让你大声喊你是个多么疯狂的人的原因。不过这是一项有趣的运动。将一个to指针转换为short,然后将其移动原来的两倍。然后返回4和5下的值组合表示为短的值。最后,感谢您提供了一个实质性的答案,而不是“不要这样做,走开”。