I need to pack a number in 1byte (char), 2 bytes (short), 4 bytes (int) and 8 bytes (long) formats and apply bitwise operator ~ (not). For these needs I use "pack" function, but faced with a problem with 8 bytes format. Consider code below:
$num = 1;
$format = "C"; // C, v, V, P
$binary_num = pack($format, $num);
$inv_binary = ~$binary_num;
$unpack_num = unpack($format, $inv_binary)[1];
echo ($unpack_num);
When $format is "C", "v" or "V" I get expected values: 254, 65534, 4294967294. But when I use "P" (long 8 bytes little endian) format I get -2 instead of 18446744073709551614. Can someone explain why this happens?
P.S. 64 bit machine PHP 7.4, 8.0
Online sandbox: https://sandbox.onlinephpfunctions.com/code/35bf7ffd4e50096c5cfe52901003ffe3b0e97d2d
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…