【问题标题】:Assignment of an integer variable address to character pointer将整数变量地址分配给字符指针
【发布时间】:2013-12-15 16:45:59
【问题描述】:

以下是一段 C++ 代码,它将整数变量地址分配给字符指针。

int ia = (1<<25) + (1<<24) + (1<<17) + (1<<8) + 4;
char *cArr = (char *)(&ia);
int i;
for(i = 0; i < 4; i++){ cout << (int)cArr[i] << endl; }

我选择了整数变量,这样 MSB 字节的值可以为 3,下一个值为 2,下一个值为 1,LSB 字节的值为 4。

现在,当我将整数的地址分配给字符指针时,我得到以下结果:

cArr[0] = 4
cArr[1] = 1
cArr[2] = 2
cArr[3] = 3

我对此结果有一些疑问:

  1. 无论我在哪个机器上工作,LSB 字节是否总是会获得第一个地址。
  2. 结果与 Little Endian 和 Big Endian 有关。我也在寻找一些可以让我了解 Little Endian 和 Big Endian 的基础教程。
  3. 结果与堆栈在机器上的增长方式有关。

顺便说一句,我在 Windows PC 上工作

【问题讨论】:

  • 为什么要写这段代码int ia = (1&lt;&lt;25) + (1&lt;&lt;24) + (1&lt;&lt;17) + (1&lt;&lt;8) + 4;
  • 确实如此。它应该是int ia = 0x03020104 或至少是int ia = (3 &lt;&lt; 24) + (2 &lt;&lt; 16) + (1 &lt;&lt; 8) + (4 &lt;&lt; 0)

标签: c++ pointers


【解决方案1】:

1)。不,这取决于计算机体系结构和硬件。这是可以作为参考的表格。

2)。基础教程。希望这就足够了。 http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html

3). 与堆栈无关,正如您从表格窗口中看到的那样,Little Endian 和因此 LSB 排在第一位。

如果能回答你,请告诉我。

再见!

【讨论】:

  • 谢谢!你的回答有帮助。但是您答案中的表格在决定字节序格式时考虑了 Windows、Mac 或 Linux 等操作系统。但据我所知,大端或小端格式取决于 CPU 处理器架构。操作系统 (OS) 不会影响系统的字节顺序。我从这个链接引用它link
  • 你是绝对正确的。其实这主要是因为windows主要是intel处理器,intel使用little endian。但是如果您在 SPARC 或 PowerMac 中安装 Windows(不确定这是否可行),您会找到另一种方式。或者换句话说,在 Windows 中编译的 C 程序在 PowerMac 机器中的行为可能会有所不同。
【解决方案2】:
  1. 没有。结果取决于您的系统硬件类型。只有 little-endian 机器才能得到您的结果。

  2. 正如问题1,这确实是由little-endian或big-endian决定的。这里是对字节序的全面介绍。 http://www.yolinux.com/TUTORIALS/Endian-Byte-Order.html

  3. 在您的情况下与堆栈无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多