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

在PHP中使用printf()函数打印带有无符号格式说明符的负整数,php,printf,unsigned-integer,Php,Printf,Unsigned Integer,我有以下代码: <?php $num1 = -12; printf("%%u = %u<br>",$num1); ?> 我无法理解这种输出背后的原因。%u代表unsigned。如果输入负数,则会造成溢出。因此产生了这么大的一个数字 内存中的数字仅为位。如果让它解释为无符号,则第一位不再是符号,而是数字的一部分 你想要的是: $num1 = -12; printf("%%u = %u<br>",abs($num1)); 任何无符号类型表示>=0个值

我有以下代码:

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

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

%u
代表unsigned。如果输入负数,则会造成溢出。因此产生了这么大的一个数字

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

你想要的是:

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

任何无符号类型表示>=0个值

以下是php文档所说的:

整数的大小取决于平台,尽管通常的最大值约为20亿(即32位有符号)。64位平台的最大值通常约为9E18,但在PHP7之前的Windows上除外,该值始终为32位。PHP不支持无符号整数。整数大小可以使用常量PHP_INT_size确定,最大值使用自PHP 5.0.5以来的常量PHP_INT_MAX确定,最小值使用自PHP 7.0.0以来的常量PHP_INT_MIN确定。

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

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

您的值4294967284是4294967295-12+1

一句话:如果正则int为正值,则可以将其安全转换为无符号int。如果为负值,则强制转换将产生由上述公式生成的值(MAX_UINT-value+1)。有符号和无符号类型仅与正值兼容

您可以使用if子句作为正确的签名格式说明符,以便准确打印值


希望这能解决问题。

我知道如何得出正确的结果。正是好奇心驱使我问这个问题。谢谢。你能更详细地解释一下内存溢出的概念吗?你说PHP不支持unsigned int。但是你说的是,对于unsigned值,它从0到4294967295I,我没有说PHP不支持unsigned int。官方文档说(粗体文本来自官方PHP文档)。它们不提供对unsigned int的本机支持,因为在版本7之前,php没有类型化声明。它们以某种方式使用我前面提到的公式模拟unsigned int。这就是我想说清楚的。有符号类型和无符号类型的值范围不同。
$num1 = -12;
printf("%%u = %u<br>",abs($num1));
printf("%%d = %d<br>",abs($num1));