【发布时间】:2012-02-04 23:01:07
【问题描述】:
假设我们谈论的是 32 位系统。
PHP 不支持无符号 INT。这意味着 INT 值应介于 -2,147,483,648 和 2,147,483,647 值之间。 INT 需要 4 个字节来存储一个 32 位长度的值。
这是否意味着我只有 31 位的值和 1 位的符号?或者我可以使用整个 32 位来存储一个值?
【问题讨论】:
标签: php int 32-bit unsigned-integer
假设我们谈论的是 32 位系统。
PHP 不支持无符号 INT。这意味着 INT 值应介于 -2,147,483,648 和 2,147,483,647 值之间。 INT 需要 4 个字节来存储一个 32 位长度的值。
这是否意味着我只有 31 位的值和 1 位的符号?或者我可以使用整个 32 位来存储一个值?
【问题讨论】:
标签: php int 32-bit unsigned-integer
首先,如果您想进行大数字(例如,通常大于 10k)的计算,您应该使用bcmath 任意精度模块。
其次,官方的 php 实现在内部使用 Two's complement 来表示数字,就像几乎所有其他编译器和解释器一样。由于有符号位的entropy(如果将0算为正数[1])为1,而31位的熵是,嗯,31,你可以存储232 = 4 294 967 296 个不同的值。您如何解释它们取决于您的应用程序。
[1] - 0 既不是正也不是负。
【讨论】:
您正在使用整个 32 位。只是默认输出函数将其解释为有符号整数。如果要显示值“原始”,请使用:
printf("%u", -1); // %u for unsigned
由于 PHP 处理内部有符号的整数,因此您只能使用位算术,而不能对它们使用加法/乘法等 - 如果您希望它们的行为类似于无符号整数。
【讨论】:
是的,如果它使用无符号整数,它将使用 32 位来存储它,因为在这种情况下您不需要符号,但由于它仅支持有符号整数,因此 32 位系统将具有 31 位的值和 1 位的值sign s0 最大有符号整数范围是 -2147483648 到 2147483647。
【讨论】:
据我所知,在 32 位系统上,可能的最大正整数是 2147483647 上面的值将是浮点值,因为 php 中的浮点值可以取值高达 10000000000000。
【讨论】:
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 确定最大值。"
【讨论】:
二进制补码最常用于存储数字,这意味着 1 位不会浪费在符号上。
http://en.wikipedia.org/wiki/Two's_complement
在 PHP 中,如果某个数字超出平台的 INT_MAX,它会将其转换为浮点值。
【讨论】:
通常对于 32 位整数,有符号和无符号之间的区别只是您如何解释值。例如,(-1)+1 对于有符号和无符号都是 1,对于有符号,这是很明显的,对于无符号,只有当你只是切断溢出时,它当然是正确的。所以你确实有 32 位来存储值,只是碰巧有 1 位的解释与其他位不同。
【讨论】: