Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sprintf如何在PHP中工作?_Php_Printf - Fatal编程技术网

sprintf如何在PHP中工作?

sprintf如何在PHP中工作?,php,printf,Php,Printf,我有点困惑。 我有php代码: echo "Hashnum='".$Hashnum."'\n"; //it prints: Hashnum='-308274319' $HashStr = sprintf('%u', $Hashnum) ; $length = strlen($HashStr); //it prints: HashStr='3986692977' 我希望最后一个命令打印相同的数字,但它打印另一个。为什么? sprintf函数如何工作?%u是一个无

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

echo "Hashnum='".$Hashnum."'\n";    //it prints:    Hashnum='-308274319'
$HashStr = sprintf('%u', $Hashnum) ;
$length = strlen($HashStr);         //it prints:    HashStr='3986692977'
我希望最后一个命令打印相同的数字,但它打印另一个。为什么?
sprintf函数如何工作?

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

原因是有符号数在二进制中的编码方式:称为

下面的公式描述了如何解释二的补码中的位(第i位的值由ai给出,它是零或一):

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

如果设置了符号位,即a31=1,则从结果中减去232-1=231,如:-aN-12N-1所示

如果位被解释为无符号数,并且“符号位”被设置为1(在您的例子中是这样),那么将添加231:

这就是为什么你会看到232的差异,也就是231的两倍

-308274319+232=3986692977


无符号数字的解释:

标题:fprintf的工作原理。内容:sprintf。标签:phpsprintf。没有意义。请阅读此
fprintf($fp,“Hello%s”,“World”)
,其中
$fp
是指向fopen的指针。但是,无符号整数将是“308274319”否,因为它解释的是数字的位表示形式。在有符号整数中,第一位表示符号。在无符号整数中,所有位表示值。因此位的解释完全不同。@punk
i
是位的索引:
a_i
表示第i位,即
a_0
是确定数字是偶数还是奇数的最低有效位。这有帮助吗?@朋克,看一下符号。回答得好,你能告诉我为什么linux将
char
数据类型转换为其数字表示(ASCII)值的完美原因吗。我只知道使用
int
操作字符串更好更快。@朋克,它不会转换,这是一个解释的问题。在内心深处,一切都存储为数字。你也许应该