【问题标题】:What does actually mean by the statement "PHP does not support unsigned integers"?声明“PHP 不支持无符号整数”实际上是什么意思?
【发布时间】:2018-06-10 02:53:00
【问题描述】:

我正在使用 PHP 7.0.2

the manual 的整数位置,我看到了以下语句:

整数可以指定为十进制(以 10 为底)、十六进制(以 16 为底)、 八进制(以 8 为基数)或二进制(以 2 为基数)表示法,前面可选 符号(- 或 +)。

在手册的一个地方,我看到了以下矛盾的陈述:

PHP 不支持无符号整数。

由于这两个句子,我感到困惑。有一个地方说一个整数前面可以有一个符号,这意味着每当我使用任何整数时,在它前面加一个符号(- 或 +)是我的选择。

同时说 PHP 不支持无符号整数。

那么,是不是说每当我使用任何整数而不在其前面加上符号(+ 或 -)时,它不会被视为 PHP 中的合法整数吗?

【问题讨论】:

  • 这可能意味着您无法通过将数字转换为无符号来调整范围。对于 MySQL,有符号范围是 -128 - 127,无符号范围是 0 - 255。对于 PHP,范围是有限的,不能更改。
  • "Unsigned integers" 仅指正整数。 PHP 仅支持“signed integers”(= 表示允许使用 +- 前缀,+ 是可选的。)
  • @mario :如果是这种情况,那么整数 0(零)之前的符号是什么,因为 0(零)既不是正整数也不是负整数?
  • 这与您最初的问题有什么关系?我们是否会被非必要的定义所困扰?
  • @mario : 我想通过理解和了解每一个细节来让我的疑问变得清晰。

标签: php types integer unsigned-integer signed-integer


【解决方案1】:

这只是意味着,每个整数都是有符号的,你不能创建无符号整数。所以如果你想使用比PHP_INT_MAX 更大的东西,你必须使用字符串(或者像 bcmath 这样的库)来解决这个问题。

【讨论】:

  • 如果这意味着每个整数都有符号并且我不能创建无符号整数,那么整数 0(零)之前的符号是什么,因为 0(零)既不是正整数也不是负整数?
  • PHP(以及几乎所有其他语言)将整数存储为二进制补码。这意味着,最高有效位存储符号。对于零,所有位都为零,也意味着符号位为零 - 所以零是一个正数。将符号位更改为 1 并保留其他所有内容为零等于 PHP_INT_MIN
【解决方案2】:

表示正整数的+前缀是可选的,正整数可以用无符号或+表示。负整数只能用-表示。

扩展示例from the integer guide

$a = 123; // decimal number (123)
$a = +123; // decimal number (123)
$a = -123; // a negative decimal number (-123)
$a = 0123; // octal number (equivalent to 83 decimal)
$a = +0123; // octal number (equivalent to 83 decimal)
$a = -0123; // octal number (equivalent to -83 decimal)
$a = 0x1A; // hexadecimal number (equivalent to 26 decimal)
$a = +0x1A; // hexadecimal number (equivalent to 26 decimal)
$a = -0x1A; // hexadecimal number (equivalent to -26 decimal)
$a = 0b11111111; // binary number (equivalent to 255 decimal)
$a = +0b11111111; // binary number (equivalent to 255 decimal)
$a = -0b11111111; // binary number (equivalent to -255 decimal)

【讨论】:

    【解决方案3】:

    为了澄清这一点,正如 integerfloat 是不同的数据类型,unsigned integer 实际上是不同的数据类型整数。一个标准的整数通常是 32 位(这可能因不同的编程语言而异)并且可以从大约 -20 亿到 +20 亿,而一个无符号整数可以从0到大约+40亿。您还可以有越来越小的整数,它们的最大值越来越低,也可以是无符号的,保持相同数量的不同选项,但只转换为正数。

    这与数据库键字段之类的内容相关,其中无符号整数非常适合自动增量标识类型字段,但在 php.ini 中将不被正确支持。它变得复杂,所以如果您只是使用 php,请不要对此感到压力,如果您将 php 与数据库提供程序一起使用,最好避免在数据中使用 unsigned integers 作为 php将中断或开始返回与实际存储的正值不同的负值。

    这种烦恼让我的眼睛微微抽搐。

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 2014-01-15
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2019-06-21
      • 2012-11-29
      • 2021-12-24
      相关资源
      最近更新 更多