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

Using printf() function in PHP to print negative integer with unsigned format specifier

我有以下代码:

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

输出:

%u = 4294967284

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

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

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

你想要的是:

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

它也适用于 %d

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

任何无符号类型都意味着 >= 0 个值。

php 文档是这样说的:

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

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

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

您的 4294967284 的值为 4294967295 - 12 + 1。

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

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

希望这能解决问题。