码:

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 0000513正是程序的输出。

最佳答案

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

此处的short放在内存中,最低有效字节(LSB)在前:

         Memory addresses ------>
            LSB          MSB

         0000 0000   0000 0000
p指向LSB并设置为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

关于c++ - 使用char指针更改short变量的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13781325/

10-13 08:12