2017-04-05 106 views
1

我正在爲Win64編寫一個32位程序的DLL插件,編譯爲Win32/Debug在Visual Studio 2015中。我需要離開將一個無符號字符(定義在上游)按56位移位到一個UINT64中,以使0xFF變爲0xFF000000000000。VS上的UINT64左移(64> shift> 32)位僅移位32位

什麼是實際發生的是,對於任何移位值大於32,結果是一個移(移 - 32)位,與我的目標UINT64的高32位成爲全1,因此:

int  NmeaPgn::sf_get_bytes(TCanMessage *m, UINT8 start_byte, UINT8 bytes) 
{ 
    UINT64 r = 0; /* Could need to fetch up to 8 bytes, as in 60928 */ 
    INT8 i; 

    for (i = start_byte + bytes - 1; i >= start_byte; --i) 
    { 
     r |= (m->data[i] << 8 * (i - start_byte)); 
    } 
... 
} 

使用VS調試器,我看到了:

m->data[i] == 0xC0 
i == 0x7 
start_byte == 0 
bytes == 8 (so that shift == 8 * (7 - 0) == 56) 

then: 
r == 0xFFFFFFFFc0000000 

我已閱讀:

https://msdn.microsoft.com/en-us/library/336xbhcz.aspx

C++ bitwise left shift by 32

Left shift an integer by 32 bits

最接近的一個答案,我可以看到的是安德烈Nasonov的答案(https://stackoverflow.com/a/33058550/7817631)於後者,但我是一個64位的機器上(Win7-64上酷睿i5)所以我不希望這是直接相關的。

+0

可能'm-> data [i]'是一個32位值(或更小)。順便說一句,你不應該編輯解決方案的問題,而是你可以發佈答案。 (雖然也許有回答你自己的問題的最低代表要求,IDK)。 –

+1

請不要發佈有問題的答案。你可以[回答](https://stackoverflow.com/help/self-answer)你自己的問題。 –

+2

@MartinZhai根據該鏈接15代表是必需的,所以我猜OP在這種情況下運氣不佳 –

回答

0

(由於TomGreen不能回答自己的問題的是,這裏是他的答案)

我必須明確地投我無符號的字符以UINT64如下:

r |= ((UINT64)m->data[i] << 8 * (i - start_byte)); 

這將產生預期值(0xC000000000)其中m->data[i] == 0xC0shift == 56