sprintf如何在PHP中运行?

时间:2013-08-19 10:36:48

标签: php printf

我有点困惑。 我有PHP代码:

echo "Hashnum='".$Hashnum."'\n";    //it prints:    Hashnum='-308274319'
$HashStr = sprintf('%u', $Hashnum) ;
$length = strlen($HashStr);         //it prints:    HashStr='3986692977'

我希望上一个命令打印相同的数字,但它打印另一个。为什么? sprintf函数如何工作?

2 个答案:

答案 0 :(得分:1)

%u无符号整数。根据定义,无符号整数只是正数,因为它们没有“符号”(表示数字是正数还是负数)。如果将负数有符号数解释为无符号数,则必然会导致结果不一致。

答案 1 :(得分:1)

原因是有符号数字以二进制编码的方式:它被称为Two's Complement

以下公式描述了位( i -th位的值由 a i 给出的值,该值为零或者一个)在二的补数中解释:

enter image description here

N 是32,因为PHP使用32位整数运算。

如果符号位已设置,即 a 31 = 1,则 2 32 - 1 = 2 从结果中减去31 ,如下所示: -a N-1 2 N-1

如果这些位被解释为无符号数,并且“符号位”设置为1(在您的情况下),则 2 31 将是添加了

enter image description here

这就是为什么你看到2 32 的差异,即两次2 31 的差异。

-308274319 + 2 32 = 3986692977

解读无符号数字: