2012-12-08 43 views
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然後
是否有任何當我運行上述程序時,我獲得了不同的結果嗎?

enter image description here

更新: 我知道,這是不確定的行爲,不過,這是否意味着十進制到二進制轉換尚未完成像往常一樣:從右到左的,而是做左至右例如:

binary(a)=1000 0000 | 0000 0000 


所以*(p)=1;會讓binary(a)=1000 0000 | 0000 0000這是十進制
和將使binary(a)=1000 0000 | 0100 0000這是513
這正是程序的輸出。

+2

HTTP:// EN。 wikipedia.org/wiki/Endianness –

+0

@BenjaminLindley而http://en.wikipedia.org/wiki/Undefined_behavior – 2012-12-08 20:01:42

+0

簡單地說,這些字節(可能)切換。你不能確定未定義的行爲,但最有可能的。考慮到這一點,您實際上將左邊的字節設置爲2,將右邊的字符設置爲1(256 * 2 + 1 = 513)。 – chris

回答

3

這裏會發生什麼情況是由於這樣的事實,我們在一個小端CPU架構的2字節short。該標準並不要求體系結構是LE,所以在任何情況下,該程序都可以在不同系統上運行時生成許多不同的結果。

甲這裏short在存儲器被佈置與所述至少顯著字節(LSB)首先:在LSB和套

  Memory addresses ------> 
      LSB   MSB 

     0000 0000 0000 0000 

p點是1

  0000 0001 0000 0000 

結果時解釋爲short爲LSB + 256 * MSB,即1 + 0 * 256 = 1

p t在MSB母雞點(其爲上一個的存儲器地址),並集的哪2

  0000 0001 0000 0010 

結果時解釋爲short:1 + 2 * 256 = 513

+0

因此,例如右移運算符會將LSB中的1移動到右側,將MSB中的1移動到左側,因此cout << (a>> 1);將打印0000 0000 0000 0001這是256.這是正確的嗎? – AlexDan

+1

@AlexDan:不,不正確。左右位移是明確的,可移植的行爲。 (1 >> 1)== 0.不管系統的字節順序如何。 –

3

是否有任何理由我得到不同的結果,當我運行上面的程序?

是的。語言不可知的答案:因爲這個程序調用未定義的行爲。回答考慮可能發生了什麼事情:您的系統的排序順序與您認爲的不同。