2017-08-08 60 views
0

要編寫一個PHP擴展,我在其中使用了>>,但意外的是它出錯了。php擴展>> bug

代碼:

printf("%08x ", (W[16])); 
printf("%08x ", (W[16]) >> 17); 
printf("%08x ", 2425545216 >> 17); 

結果:

9092e200 40c04849 00004849 

注:

W[16]=0x9092e200 = 2425545216,在C,代碼工作的權利。但在php擴展中,>>沒有填充0到左邊。

php_version: PHP:7.1.7 感謝您的幫助。

+0

不要編輯您的問題,包括回答。 Upvote任何你發現有用的答案,並標記接受回答你的問題的一個答案。請參閱https://stackoverflow.com/help/someone-answers。 – miken32

回答

3

在C中,有符號整數的按位右移操作的結果是實現定義的。例如,請參閱this question的答案。

0x9092e200可以解釋爲無符號整數2425545216以及有符號整數-1869422080。例如,下面的代碼輸出-1869422080 2425545216

int x = 0x9092e200; 
printf("%d %d", x, (unsigned)x); 

所以,如果你想以填補零空置位,投W[16]無符號,如:

printf("%08x ", ((unsigned int)W[16]) >> 17);