我有点困惑。 我有PHP代码:
echo "Hashnum='".$Hashnum."'\n"; //it prints: Hashnum='-308274319'
$HashStr = sprintf('%u', $Hashnum) ;
$length = strlen($HashStr); //it prints: HashStr='3986692977'
我希望上一个命令打印相同的数字,但它打印另一个。为什么? sprintf函数如何工作?
答案 0 :(得分:1)
%u
是无符号整数。根据定义,无符号整数只是正数,因为它们没有“符号”(表示数字是正数还是负数)。如果将负数有符号数解释为无符号数,则必然会导致结果不一致。
答案 1 :(得分:1)
原因是有符号数字以二进制编码的方式:它被称为Two's Complement。
以下公式描述了位( i -th位的值由 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
解读无符号数字: