我有点困惑。我有php代码:
echo "Hashnum='".$Hashnum."'\n"; //it prints: Hashnum='-308274319'
$HashStr = sprintf('%u', $Hashnum) ;
$length = strlen($HashStr); //it prints: HashStr='3986692977'
我希望最后一个命令打印相同的数字,但它会打印另一个。为什么?sprintf 函数是如何工作的?
原因是有符号数字以二进制编码的方式:它被称为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
无符号数的解释:
%u是一个无符号整数。根据定义,无符号整数只是正数,因为它们没有“符号”(表示数字是正数还是负数的位)。如果您将带负号的数字解释为无符号的数字,则结果必然不会相同。