码:
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
正是程序的输出。 最佳答案
发生这种情况是由于我们在小端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/