pack('i',1)总是4个字节吗?

5
在我的机器上,PHP_INT_SIZE8,但是pack('i',1)返回的仍然是一个4字节的字符串。 文档中说i是一个"有符号整数(与机器相关的大小和字节顺序)",但这似乎并不正确。它固定为4个字节吗?
这意味着在64位机器上,unpack('i',pack('i',PHP_INT_MAX))[1] !== PHP_INT_MAX,因为一半的数据被截断了。

刚在64位Linux上复现了,所以这不一定是由于缺乏64位整数而仅限于Windows的问题。 - Álvaro González
“signed integer (machine dependent size and byte order)”并不意味着它的大小应该等于PHP_INT_SIZE,即使这是每个人都期望的。 - Holt
2个回答

3

重要的是要记住PHP是用C语言编写的(换句话说,PHP认为int是什么并不重要)。根据其他答案关于sizeof(int)的解释,看起来它是32位C编译器的遗物(强调是我的)。

是的,它取决于处理器(更具体地说,ISA,指令集架构,例如x86和x86-64)和编译器,包括编程模型。例如,在16位机器上,sizeof(int)为2个字节。32位机器的int有4个字节。一直认为int是处理器的本机大小,即寄存器的大小。然而,32位计算机非常流行,并且已经为32位编程模型编写了大量软件。因此,如果64位计算机的int有8个字节,那将非常令人困惑。Linux和Windows都保持int为4个字节。但是,它们在long的大小上有所不同。
简而言之,如果您有16位处理器,则可以使用2个字节。在32位和64位系统中,C似乎在所有情况下都表示int为4个字节。因此,是的,pack('i',1);始终为4个字节。

1
是的(大部分)。
从PHP源代码(pack.c)中:

switch ((int) code) {
    //...

    case 'i': 
    case 'I':
        INC_OUTPUTPOS(arg,sizeof(int))
        break;

    //...
}

该函数使用 sizeof(int)(在您的情况下,以及大多数情况下 [需要引证] 将为4),而不是 PHP_INT_SIZE 的值。虽然没有完全解答“为什么”的问题,但由于该函数的想法来自Perl,PHP可能只是追求类似的功能。

不对。如果你在32位或64位的机器上,sizeof(int)会有所不同。 - Ryan
@true 你能提供一个引用吗?我知道它不总是相同的,但对我来说似乎始终是4(并且类似的结果在这里报告:https://dev59.com/TXRB5IYBdhLWcg3wj32c) - username tbd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接