使用PHP中的printf()函数打印带有无符号格式说明符

时间:2017-07-02 08:44:34

标签: php printf unsigned-integer

我有以下代码:

<?php
  $num1 = -12;
  printf("%%u = %u<br>",$num1);
?>

输出:

%u = 4294967284

我无法理解这种输出背后的原因。

2 个答案:

答案 0 :(得分:1)

%u代表无符号。如果输入负数,则表示正在创建溢出。因此产生了这么大的数字。

内存中的数字只是位。如果你将它解释为无符号,则第一位不再是符号,而是数字的一部分。

你想要的是:

$num1 = -12;
printf("%%u = %u<br>",abs($num1));

它也适用于%d

printf("%%d = %d<br>",abs($num1));

答案 1 :(得分:0)

任何无符号类型表示&gt; = 0值。

以下是php文档的说法:

整数的大小取决于平台,尽管最大值约为20亿是通常的值(32位签名)。 64位平台的最大值通常约为9E18,除了PHP之前的Windows,它总是32位。 PHP不支持无符号整数。整数大小可以使用常量PHP_INT_SIZE确定,最大值使用自PHP 5.0.5起的常量PHP_INT_MAX,使用自PHP 7.0.0起使用常量PHP_INT_MIN的最小值。

我在Windows x64上运行它,因此PHP_INT_MAX的值将是64位整数(9223372036854775807)。根据您报告的值,您可能拥有32位系统。

因此,对于您的系统,带符号的32位整数值范围为-2147483648到2147483647.对于无符号值,它从0到4294967295.

您的值4294967284是4294967295 - 12 + 1.

底线:如果它是一个正值,你可以安全地将常规int转换为unsigned int。如果它是负值,则转换将产生由上面的公式生成的值(MAX_UINT - 值+ 1)。有符号和无符号类型仅与正值兼容。

您可以将if子句用于正确的签名格式说明符,以准确打印值。

希望这能解决问题。