PHP с префиксом значения шестнадцатеричного суммирования с 1?

Я работаю над тем, что добавляет несколько шестнадцатеричных значений (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 перед ней.

Есть ли причины такого поведения, и если да, то как я могу предотвратить это?

1

Решение

Ваши ответы отличаются, потому что вы специально вводите свои переменные C как 32-битные, и поэтому сложение переполняется, оставляя вам результат 0x54da50e8, Однако целые числа PHP имеют тот же размер, что и установка, в данном случае 64-разрядная, поэтому арифметика не переполняется, и вы получите правильную сумму: 0x154da50e8, (Обратите внимание, что ваш 8 спецификация ширины до sprintf является минимумом, следовательно, вы получите все 9 цифр из результата). Если вам нужен только 32-битный результат, вам нужно замаскировать значение $test6 соответственно то есть

$test6 &= (1 << 32) - 1;
echo(sprintf( "%08x \n", $test6 ));

Выход:

54da50e8
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]