代码:
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
{{1}}作为{{1}}
这正是程序的输出。
答案 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