1

代码:

int main(){
   short a=1;         // #1
   char *p=(char*)&a;
   *(p)=1;            // #2
   cout << a << endl; // Output: 1
   *(p+1)=2;          // #3
   cout << a << endl; // Output: 513
}

根据我的理解,输出应该如下图所示,257,然后是258。
运行上面的程序时我得到不同的结果有什么原因吗?

在此处输入图像描述

更新: 我知道这是未定义的行为,但这是否意味着十进制到二进制的转换没有像往常一样完成:从右到左,而是从左到右完成,例如:

binary(a)=1000 0000 | 0000 0000


所以*(p)=1;binary(a)=1000 0000 | 0000 0000生成1十进制的
*(p+1)=2;并将生成binary(a)=1000 0000 | 0100 0000程序513
的输出。

4

2 回答 2

3

当我运行上面的程序时,我得到不同的结果有什么原因吗?

是的。与语言无关的答案:因为这个程序调用了未定义的行为。考虑实际可能发生的情况来回答:您的系统具有与您认为的不同的字节序。

于 2012-12-08T20:01:11.557 回答
3

这里发生的情况是因为我们short在小端 CPU 架构中有一个 2 字节。该标准不要求架构是 LE,因此在任何情况下,该程序在不同系统上运行时都会产生许多不同的结果。

此处的Ashort以最低有效字节 (LSB) 在内存中布局:

         Memory addresses ------>
            LSB          MSB

         0000 0000   0000 0000

p指向 LSB 并设置为1

         0000 0001   0000 0000

解释为 a 时的结果short是 LSB + 256 * MSB,即 1 + 0 * 256 = 1

p然后指向 MSB(在下一个内存地址上)并设置为2

         0000 0001   0000 0010

解释为 a 时的结果short:1 + 2 * 256 = 513

于 2012-12-08T20:01:14.530 回答