在 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 子句用于正确的带符号格式说明符以准确打印值。
希望这能解决问题。
我有以下代码:
<?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 子句用于正确的带符号格式说明符以准确打印值。
希望这能解决问题。