我正在研究添加几个十六进制值(base16)的东西。
在常规 C 程序中,我执行以下操作:
uint32_t test1 = 0x5BE0CD19;
uint32_t test2 = 0x3587272B;
uint32_t test3 = 0x1F85C98C;
uint32_t test4 = 0x428A2F98;
uint32_t test5 = 0x61626380;
uint32_t test6 = (test1 + test2 + test3 + test4 + test5);
printf( "%08x \n", test6 );
结果是:
> 54da50e8
但是,在 PHP 中(我的 PHP 是 64 位),当我应用相同的总和时:
$test1 = 0x5BE0CD19;
$test2 = 0x3587272B;
$test3 = 0x1F85C98C;
$test4 = 0x428A2F98;
$test5 = 0x61626380;
$test6 = ($test1 + $test2 + $test3 + $test4 + $test5);
echo(sprintf( "%08x \n", $test6 ));
我得到:
> 154da50e8
奇怪的是,这个数字多了一个字符,前面有一个
1
。
这种行为有任何原因吗?如果有,我该如何防止它?
您的答案有所不同,因为您专门将 C 变量键入为 32 位,因此加法溢出,留下结果
0x54da50e8
。然而,PHP 整数的大小与安装的大小相同,在本例中为 64 位,因此算术不会溢出,您会得到正确的总和:0x154da50e8
。 (请注意,您的 8
宽度规格为 sprintf
是最小值,因此您可以从结果中获得所有 9 位数字)。如果您只想要 32 位结果,则需要适当屏蔽 $test6
的值,即
$test6 &= (1 << 32) - 1; // 0xFFFFFFFF
echo(sprintf( "%08x \n", $test6 ));
输出:
54da50e8