使用char指针更改short变量的值

时间:2012-12-08 19:59:09

标签: c++ memory memory-address

代码:

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 当我运行上面的程序时,有什么理由得到不同的结果吗?

enter image description here

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

binary(a)=1000 0000 | 0000 0000


*(p)=1; binary(a)=1000 0000 | 0000 00001作为*(p+1)=2;的十进制数 binary(a)=1000 0000 | 0100 0000513 {{1}}作为{{1}} 这正是程序的输出。

2 个答案:

答案 0 :(得分:3)

  

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

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

答案 1 :(得分:3)

这里发生的事情是由于我们在一个小端CPU架构中有一个2字节short。该标准不要求架构为LE,因此无论如何,当在不同系统上运行时,该程序可以生成许多不同的结果。

这里的short在最低有效字节(LSB)的内存中排列:

         Memory addresses ------>
            LSB          MSB

         0000 0000   0000 0000
LSB上的

p点和设置为1

         0000 0001   0000 0000

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

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

         0000 0001   0000 0010

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