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

问题描述 投票:0回答:2

在我的机器上

PHP_INT_SIZE
8
pack('i',1)
无论如何都会返回 4 字节字符串。

文档

i
是一个“有符号整数(取决于机器的大小和字节顺序)”,但这似乎不是真的。是固定为4字节吗?

这意味着

unpack('i',pack('i',PHP_INT_MAX))[1] !== PHP_INT_MAX
在 64 位机器上,因为一半的数据被删除。

php pack
2个回答
3
投票

重要的是要记住 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 个字节。


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 可能只是追求类似的功能。

© www.soinside.com 2019 - 2024. All rights reserved.