1

让我们假设我们正在谈论 32 位系统。

PHP 不支持无符号 INT。这意味着 INT 值应介于 -2,147,483,648 和 2,147,483,647 值之间。INT 需要 4 个字节来存储一个 32 位长度的值。

那么这是否意味着我只有 31 位的值和 1 位的符号?或者我可以使用整个 32 位来存储一个值?

4

7 回答 7

4

正在使用整个 32 位。只是默认输出函数将其解释为有符号整数。如果要显示值“原始”,请使用:

printf("%u", -1);    //  %u for unsigned

但是,由于 PHP 处理内部签名的整数,因此您只能对它们使用位算术,而不能使用加法/乘法等 - 如果您希望它们表现得像无符号整数。

于 2012-01-07T16:14:55.430 回答
1

首先,如果你想用巨大的数字进行计算(比如,经常大于 10k),你应该使用bcmath任意精度模块。

其次,官方的 php 实现在内部使用二进制补码来表示数字,就像几乎所有其他编译器和解释器一样。由于有符号位的(如果将 0 视为正数[1])为 1,而 31 位的熵是 31,因此您可以存储 2 32 = 4 294 967 296 个不同的值。您如何解释它们取决于您的应用程序。


[1] - 0 既不是正也不是负。

于 2012-01-07T16:09:26.167 回答
1

据我所知,在 32 位系统上,可能的最大正整数是 2147483647 上面的值将是浮点值,因为 php 中的浮点值可以取值高达 10000000000000。

于 2012-01-07T16:12:00.023 回答
0

通常对于 32 位整数,有符号和无符号之间的区别就是您解释值的方式。例如,(-1)+1 对于有符号和无符号都是 1,对于有符号,这很明显,对于无符号,只有当你把溢出切掉时,它当然是正确的。所以你确实有 32 位来存储值,只是碰巧有 1 位的解释与其他位不同。

于 2012-01-07T16:08:37.203 回答
0

二进制补码最常用于存储数字,这意味着 1 位不会浪费在符号上。

http://en.wikipedia.org/wiki/Two's_complement

在 PHP 中,如果一个数字溢出平台的 INT_MAX,它会将其转换为浮点值。

于 2012-01-07T16:09:45.240 回答
0

2147483647 是通常的值 2^31-1。1 位表示符号和 -1,因为我们也表示 0。

来自手册:“整数的大小取决于平台,尽管通常值约为 20 亿的最大值(即 32 位有符号)。64 位平台的最大值通常约为 9E18。PHP 没有支持无符号整数。从 PHP 4.4.0 和 PHP 5.0.5 开始,可以使用常量 PHP_INT_SIZE 确定整数大小,使用常量 PHP_INT_MAX 确定最大值。

于 2012-01-07T16:11:57.233 回答
0

是的,如果它使用无符号整数,它将使用 32 位来存储它,因为在这种情况下您不需要符号,但由于它仅支持有符号整数,因此 32 位系统将具有 31 位的值和 1 位的符号 s0 最大值有符号整数范围是 -2147483648 到 2147483647。

于 2012-01-07T16:14:12.660 回答