php 扩展 >> 错误
php extension >> bug
为了写一个PHP扩展,我在里面用了>>
,没想到出错了
代码:
printf("%08x ", (W[16]));
printf("%08x ", (W[16]) >> 17);
printf("%08x ", 2425545216 >> 17);
结果:
9092e200 40c04849 00004849
注:
W[16]=0x9092e200 = 2425545216
,在 c 中,代码工作正常。但是在 php extension 中,>>
不向左填充 0。
php_version: PHP: 7.1.7
谢谢你的帮助。
在 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);
为了写一个PHP扩展,我在里面用了>>
,没想到出错了
代码:
printf("%08x ", (W[16]));
printf("%08x ", (W[16]) >> 17);
printf("%08x ", 2425545216 >> 17);
结果:
9092e200 40c04849 00004849
注:
W[16]=0x9092e200 = 2425545216
,在 c 中,代码工作正常。但是在 php extension 中,>>
不向左填充 0。
php_version: PHP: 7.1.7 谢谢你的帮助。
在 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);