2011-10-30 49 views
4

我有一個問題,我無法序列64位整數(32位作品)連載64位寬度整數

代碼如下:

uint64_t t = (uint64_t) 0; 
uint8_t buffer[8]; 

buffer[0] = 0x12; 
buffer[1] = 0x34; 
buffer[2] = 0x56; 
buffer[3] = 0x78; 
buffer[4] = 0x9A; 
buffer[5] = 0xBC; 
buffer[6] = 0xDE; 
buffer[7] = 0xF0; 

printf("uint64_t width: %lu\n",sizeof(t)); 

t |= (uint64_t) ((buffer[7] << (7*8)) & 0xFF00000000000000); 
t |= (uint64_t) ((buffer[6] << (6*8)) & 0x00FF000000000000); 
t |= (uint64_t) ((buffer[5] << (5*8)) & 0x0000FF0000000000); 
t |= (uint64_t) ((buffer[4] << (4*8)) & 0x000000FF00000000); 
t |= (uint64_t) ((buffer[3] << (3*8)) & 0x00000000FF000000); 
t |= (uint64_t) ((buffer[2] << (2*8)) & 0x0000000000FF0000); 
t |= (uint64_t) ((buffer[1] << (1*8)) & 0x000000000000FF00); 
t |= (uint64_t) ((buffer[0])    & 0x00000000000000FF); 

printf("uint64 value: 0x%llu\n",t); 

但是編譯器警告我,我有位對於高32位移動太遠了。 sizeof運算符告訴我它的64位寬度?

輸出爲:

uint64_t width: 8 
uint64 value: 0x78563412 

怎麼回事請告訴我?

回答

6

您需要在之前施放

t |= ((uint64_t)buffer[7] << (7*8)) & 0xFF00000000000000LLU; 

其實你甚至不需要掩模所以這可能只是被簡化爲:

t |= (uint64_t)buffer[7] << (7*8); 
+1

+1正要張貼此。該面具不需要後綴[6.4.4.1.5](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf)。 '(buffer [7] <<(7 * 8LLU))'可以減少輸入。 – user786653

+0

@ user786653:是的,我認爲你是對的 - 我總是在這種情況下添加'LLU',因爲它使得代碼更加自明和清晰,但它可能不是必須的。 –

+0

我同意,如果沒有其他答案將此稱爲*代碼中的缺陷,我就不會那麼迂腐了。 – user786653

1

0xFF00000000000000是一個int32常量。 0xFF00000000000000LLU應該改爲

+0

年底這是不相關的實際問題 - 看到@ user786653評論我的回答 –

0

編譯器轉換緩衝器[I]爲int是32位。 您需要將緩衝區顯式強制轉換爲64位的unsigned int。 即

((uint64_t)buffer[i]) << (numBitsToShift) 

,並添加LLU到您的常量