2011-12-22 113 views
3

所以我正在將一個char變爲long,然後清除並重新執行。 15的變化使我的機器變得古怪,請參閱代碼中的評論。你認爲這是什麼造成的?C位移位奇數結果過去15位移位左移

本機焦爲0x00,並長期爲0x0000 0000

unsigned char temp; 
    unsigned long open_code; 

    temp = 0x01; 
    open_code = open_code | (temp <<1);// open_code = 0x0000 0002 
    open_code = 0; 
    //......  
    // 2 - 7  
    //.... 
    temp = 0x01; 
    open_code = open_code | (temp <<8); // open_code = 0x0000 0100 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<9); // open_code = 0x0000 0200 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<10); // open_code = 0x0000 0400 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<11); // open_code = 0x0000 0800 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<12); // open_code = 0x0000 1000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<13); // open_code = 0x0000 2000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<14); // open_code = 0x0000 4000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<15); // open_code = 0xFFFF 8000 !!!!! 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<16); // open_code = 0x0000 0000 !!!!! 
+0

你試圖複製焦炭引入長,然後再轉移呢? –

+0

對我來說完全「正常」。只是C的各種投射規則的交互(這通常是不可思議的)。 –

+0

你在哪個平臺上? –

回答

2

它看起來像你的轉移unsigned char太遠,結果引發溢出。之前,儘量轉移其強制轉換爲long,就像這樣:

open_code = open_code | (((long)temp) <<15); 
+0

的偏差中描述。這種轉變發生在臨時內部嗎?這就說得通了。 – eagletusk

+0

@ user2758:我不確定說這是否發生_inside_'temp'是準確的。其實,你可能是對的,我的回答可能是錯的。你可能需要讓'temp'成爲一個更大的類型! –

+1

在移位運算符執行前,temp會被提升爲int。這個問題可能與int被簽署有關,但我還沒有完全理解爲什麼。 –