我正在为Win64上的32位程序编写一个DLL插件,在Visual Studio 2015中编译为Win32 / Debug。我需要将一个无符号字符(定义为上游)的位移56位转换为UINT64,这样0xFF应该变成0xFF000000000000。
实际发生的是,对于任何大于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
Left shift an integer by 32 bits
我能看到的最接近答案的是Andrey Nasonov对后者的回答(https://stackoverflow.com/a/33058550/7817631),但我使用的是64位机器(Core i5上的Win7-64),所以我不希望这样直接相关。
答案 0 :(得分:0)
(因为TomGreen还不能回答他自己的问题,这是他的回答)
我必须按如下方式将我的unsigned char显式地转换为UINT64:
r |= ((UINT64)m->data[i] << 8 * (i - start_byte));
这会产生预期值(0xC000000000)
,其中m->data[i] == 0xC0
和shift == 56
。