-1

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

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

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

4

2 回答 2

1

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

下面的公式描述了二进制补码数中的位(第i位的值由a i给出,为零或一)如何解释:

在此处输入图像描述

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

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

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

在此处输入图像描述

这就是为什么您会看到 2 32的差异,即 2 31的两倍。

-308274319 + 2 32 = 3986692977

无符号数的解释:

于 2013-08-19T10:55:08.310 回答
1

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

于 2013-08-19T10:40:10.733 回答