2017-08-08 7 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

は答えを含めるようにあなたの質問を編集しないでください。あなたが助けてくれた回答をアップアップして、あなたの質問に答えた答えを受け入れてください。 https://stackoverflow.com/help/someone-answersを参照してください。 – miken32

答えて

3

符号付き整数に対するビット単位の右シフト演算の結果は、実装定義です。たとえば、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); 
関連する問題