在我的机器上
PHP_INT_SIZE
是 8
但 pack('i',1)
无论如何都会返回 4 字节字符串。
文档说
i
是一个“有符号整数(取决于机器的大小和字节顺序)”,但这似乎不是真的。是固定为4字节吗?
这意味着
unpack('i',pack('i',PHP_INT_MAX))[1] !== PHP_INT_MAX
在 64 位机器上,因为一半的数据被删除。
重要的是要记住 PHP 是用 C 编写的(换句话说,PHP 认为
int
是什么并不重要)。跳出关于sizeof(int)
的其他答案,它看起来像是32位C编译器的遗物(强调我的)
是的,这取决于两个处理器(更具体地说,ISA、 指令集架构(例如 x86 和 x86-64)和编译器 包括编程模型。例如,在16位机器中,sizeof (int) 是 2 个字节。 32 位机器有 4 个字节用于 int。 认为 int 是处理器的本机大小,即 登记。然而,32位计算机非常流行,而且数量巨大 的软件是针对 32 位编程模型编写的。 那么,它 如果 64 位计算机有 8 个字节用于 int,将会非常混乱。 Linux 和 Windows 都为 int 保留 4 个字节。但是,它们的不同之处在于 长的尺寸。
所以,简而言之,它可能是 2 个字节,但前提是您有 16 位处理器。在 32 位和 64 位系统中,C 似乎在所有情况下都表示
int
是 4 个字节。所以,是的,pack('i',1);
将始终是 4 个字节。
是的(大部分)。
来自 PHP 的源代码 (
pack.c
):
switch ((int) code) {
//...
case 'i':
case 'I':
INC_OUTPUTPOS(arg,sizeof(int))
break;
//...
}
该函数使用
sizeof(int)
(在您的情况下(以及大多数情况[需要引用])将为 4),而不是 PHP_INT_SIZE
的值。没有完全涵盖“为什么?”的问题,但由于该函数的想法取自 Perl,PHP 可能只是追求类似的功能。